当前位置: 首页 > 工具软件 > cmake-conan > 使用案例 >

Conan和Cmake踩坑

雍志新
2023-12-01

Cmake基本函数、变量等

  • add_library 指定源文件生成库文件

  • link_directories 将路径添加到库搜索路径中。使用TARGET_LINK_LIBRARIES时只需要给出库名字。(但不推荐

  • link_libraries 链接库,放在add_exexxx之前,使用路径直接链接库到所有目标

  • target_link_library ,放在add_exexxx之后,指定库名称(在link_directories 后)和目标。只让目标链接库

  • find_package(包名称 XXX),找到后,将头文件目录设置到XXX_INCLUDE_DIRS,库目录设置到XXX_LIBS cmake find_package路径详解 - 知乎 (zhihu.com)

  • find_library (变量名 库名 路径)尝试在默认以及指定的路径下搜索库,找到后给变量

  • find_path (变量名 文件名 路径) 同上,但查找的是指定文件

  • include_directories 添加查找头文件的文件夹

“轻松搞定CMake”系列之CMakeLists文件编写语法规则详解_zhanghm1995的博客-CSDN博客_cmake语法

变量名 含义

PROJECT_NAME project命令中写的项目名
CMAKE_VERSION 当前使用CMake的版本
CMAKE_SOURCE_DIR 工程顶层目录,即入口CMakeLists文件所在路径
PROJECT_SOURCE_DIR 同CMAKE_SOURCE_DIR
CMAKE_BINARY_DIR 工程编译发生的目录,即执行cmake命令进行项目配置的目录,一般为build
PROJECT_BINARY_DIR 同CMAKE_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR 当前处理的CMakeLists.txt中生成目标文件所在编译目录
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt文件的完整路径
CMAKE_CURRENT_LIST_DIR 当前处理的CMakeLists.txt文件所在目录的路径
CMAKE_INSTALL_PREFIX 指定make install命令执行时包安装路径
CMAKE_MODULE_PATH find_package命令搜索包路径之一,默认为空
编译配置相关变量:

变量名 含义

CMAKE_BUILD_TYPE 编译选项,Release或者Debug,如set(CMAKE_BUILD_TYPE “Release”)
CMAKE_CXX_FLAGS 编译标志,设置C++11编译,set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”)
CMAKE_CXX_STANDARD 也可以设置C++11编译,set(CMAKE_CXX_STANDARD 11)

指定这三个变量可以修改输出目录
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置;
CMAKE_LIBRARY_OUTPUT_DIRECTORY:默认存放动态库的文件夹位置;
CMAKE_RUNTIME_OUTPUT_DIRECTORY:存放可执行软件的目录;


CMAKE警告

  • 有时要求设置工程版本。就 project 加个VERSION 1.x.x 但又似乎提示CMP0048 is set to NEW,可能要求指定cmake使用更高的版本号。之后重新生成时又没有要求设置工程版本的经过

Conan

  • conan install报update需要5个参数,但只给了一个。查看源码无解。整理后发现是Python版本是2.7.0,而使用的conan版本需要2.7.10以上。
  • cmake使用conan后项目的输出目录发生改变,查看conan生成的cmake文件,里面修改了上述变量。如果想要重新指定个人感觉还是在include(${PROJECT_BINARY_DIR}/conanbuildinfo.cmake)后面改好些(放前面是没用的)。很可惜的是不管是Debug还是Release输出目录都一样的
  • 同理似乎是修改了lib位置,以防万一有需要可以加一句link_directories
  • conan install时加 -if 参数可以指定conan文件输出位置
  • 视工程情况可能要用–profile指定一些setting的参数
 类似资料: