CMakeLists.txt写法示例


变量、函数

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的子目录或文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值