最近做的项目都是使用Cmake,但在参考开源项目的代码的时候,发现不同的人使用不同的方法,这时候你可能会不知所以然,但其实就是人们说的,条条大路通罗马,你不必纠结使用哪种方法,能通往罗马就可以啦。这总结了别人常用的几种方法,也是学习的总结。可能有不足的地方,仅供参考,如有错误的地方欢迎指正。
1.方法1
set(SRC_LIST main.c test1.c test2.cpp)
add_executable(Demo ${SRC_LIST})
(1)定义了这个工程会生成一个文件名为 hello 的可执行文件,
(2)相关的源文件是 SRC_LIST 中 定义的源文件列表,其中SRC_LIST是一个变量名,这变量名你可以自己取名字。SRC_LIST后面是C文件或者cpp文件,可以有若干个,不清楚是否有最大值限制。使用了${}来引用变量,这是 cmake 的变量应用方式。
2.方法2
file(GLOB_RECURSE ALL_SRCS *.cpp *.c)
add_executable(Demo ${ALL_SRCS})
此处*.cpp *.c你可以再增加自己的路径,比如src/math/*.cpp *.c
3.方法3
add_executable(Demo main.c test1.c test2.cpp)
4.方法4
# 查找当前目录下的所有源文件,并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
5.方法5,使用add_library,这个可以和方法6可以做个对比
add_library(Demo test1.c test2.cpp)
#或者
#add_library(${PROJECT_NAME} test1.c test2.cpp)
add_executable(Demo main.c)
#或者
#add_executable(Demo main.cpp)
#或者
#add_executable(${PROJECT_NAME} main.cpp)
#需要链接的其他库,比如boost,或者其他自己写的cpp,此项应该不是必要的,如果没有需求链接的库应该是可以不用此项的,暂时未做测试。
target_link_libraries(${PROJECT_NAME}
${Boost_LIBRARIES}
test3.c
test4.cpp
)
6.方法6,生成库,通过链接库包含源文件,这个可以和方法5可以做个对比
#这里是你的头文件目录,可能你的头文件不是放在math子目录目录下,需要更换成你自己的目录
include_directories("${PROJECT_SOURCE_DIR}/math")
#添加一个子目录并构建该子目录,子目录名称为math,并且子目录下必须有CMakeLists.txt
add_subdirectory(math)
add_executable(Demo main.c)
#指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库,这个 MathFunctions 链接库就是子目录生成的链接库
target_link_libraries(Demo MathFunctions)
子目录math的CMakeList.txt如下:
#查找math目录下的所有源文件#并将名称保存到DIR_LIB_SRCS 变量,此时可以刚刚讲的几种方便包含源文件。不一定要用aux_source_directory
aux_source_directory(. DIR_LIB_SRCS)
add_library (MathFunctions ${DIR_LIB_SRCS})
总的来说,cmake是很灵活的,有很多种方式,可以实现你的功能,并且维护简单就可以啦!可能还有其他的方法,欢迎留言补充!
感觉还不错,点个赞吧,你的支持是我继续写博客的动力。大家一起学习进步!
参考自:
https://www.cnblogs.com/chenlinchong/p/13649971.html
https://www.cnblogs.com/wuchaodzxx/p/8915539.html
https://www.jianshu.com/p/ffd475455f63
《CMake Practice》CMake 实践