变量、函数
cmake使用示例与整理总结_cwjokaka的博客-CSDN博客
1、单目录单文件文件写
cmake_minimum_required(VERSION 3.2)
project(test)
add_executable(test ./main.cpp)
2、单目录多文件
cmake_minimum_required(VERSION 3.2)
project(test)
aux_source_directory(./ SRC_LIST)
add_executable(test ${SRC_LIST})
3、多文件多目录的标准写法
src子目录下:
aux_source_directory(./ SRC_LISTS)
#设置include目录,引用头文件时不需要写绝对路径也可以
include_directories(${PROJECT_SOURCE_DIR}/include)
#将库文件输出目录指定为cmake执行目录下的/lib
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#默认生成静态库,等效于add_library(add STATIC ${SRC_LISTS})
#动态库将STATIC换成SHARED
add_library(add ${SRC_LISTS})
根目录下:
#指定最低版本
cmake_minimum_required(VERSION 3.10)
#工程名
project(test3)
#添加子目录,否则main链接库文件的时候会找不到位置
add_subdirectory(${PROJECT_SOURCE_DIR}/src)
#添加头文件目录,main.cpp中可直接包含头文件,不用写路径
include_directories(${PROJECT_SOURCE_DIR}/include)
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LISTS)
#指定可执行文件输出位置为make执行目录下的/bin
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#添加库文件搜索路径
#可用于已经存在的库,或者项目中不想重复编译生成的库
#注意:只对此命令执行之后生成的可执行文件有效
#link_directories(BEFORE ${PROJECT_BINARY_DIR}/lib)
#生成可执行文件
add_executable(main ${SRC_LISTS})
#添加生成可执行文件的依赖,当在项目中的文件过于庞大,会导致编译的顺序不会按照add_subdurectory引入
#的先后顺序,此时就需要使用该指令进行依赖指定,这样的好处在于,由于依赖关系的存在,所有被依赖的项目
#将会最先构建,这样不会出现找不到库而报错。
#add_dependencies(main add)
#连接库文件
target_link_libraries(main add)
编译流程:
cd ./build
cmake ..
make
4、构建静态库、共享库
静态库:add_library ( [库名] STATIC [源文件列表] )
动态库:add_library ( [库名] SHARED [源文件列表] )
指定库生成路径:set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
- 生成库文件时会自动在名字前面加上lib前缀
- 静态库的后缀是.a 动态库的后缀是.so
一般按照规则动态库应当要有版本号,使用如下命令:
其中VERSION是值动态库版本,SOVERSION指API版本
set_target_properties(hello PROPERTIES VERSION 1.0 SOVERSION 1)
执行此命令后,会自动在目标路径生成
libxxx.so.1.0
libxxx.so.1 (软链 -> libxxx.so.1.0)
libxxx.so (软链 -> libxxx.so.1)
5、安装库文件和头文件
编译后其他程序要想使用此库文件,第一个办法是把库文件和头文件拷贝到当前目录下,并在CMakeLists.txt中指定include路径和link路径,第二个办法就是把库文件和头文件安装到当前机器上,就可以在本机器上的任何项目中使用
install(TARGETS [库名] DESTINATION lib)
这条命令指定了将项目的主要目标(通常是一个库或可执行文件)安装到系统的lib目录下。
install(DIRECTORY [目录] DESTINATION include/xxx
FILES_MATCHING PATTERN "*.h"
PATTERN test EXCLUDE)
把指定目录安装到系统的include目录下,可以在include下指定子目录,后面两行的意思分别是,只安装.h文件,排除名为test的子目录或文件