Linux环境下Cmake学习笔记
原文
https://blog.youkuaiyun.com/weixin_43717839/article/details/128032486
Cmake的安装
可以使用apt-get install cmake命令直接安装Cmake包。安装好后输入一下命令,若出现版本号则表示安装成功。
1. 单个文件main的编译
main.c源文件
CMakeMists.txt
//第一个参数是生成可执行文件的名字,第二个参数是源文件名字
add_executable(mian main.c)
main.c和CMakeLists.txt在同一个目录下,最后在此目录下执行cmake命令
会生成中间文件。再执行make命令。生成可执行文件main。
2. 多个源文件文件编译
aux_source_directory
将多个源文件放在add_executable(mian main.c)的源文件后面,可以发现,在编译多个源文件时只要add_executable里把所有源文件都添加进去就可以了。但是这种情况当有很多源文件时,就要列举出所有源文件名称。这样效率不高。我们可以使用aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LIST里;
.表示CMakeLists所在目录,即该文件所在当前目录。
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件
在不同目录下多个源文件文件编译
include_directories为工程添加多个头文件的搜索路径,这样我们在main.c中就可以直接引用
//
#include"fun.h"
#include"fun1.h"
int main(void){
.....
}
而不是
//
#include"fun/fun.h"
#include"fun1/fun1.h"
int main(void){
.....
}
3.项目级的组织结构
头文件放在一个文件夹。源文件放在当前项目文件夹下
头文件放在一个文件夹。源文件放在一个文件夹
cmake_minimum_required (VERSION 2.8)
project (demo)
//将生成的可执行文件夹放在文件夹bin中
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
aux_source_directory (src SRC_LIST)
include_directories (include)
add_executable (main ${SRC_LIST})
运行结果
4. 动态库和静态库编译
4.1 库文件的生成
cmake_minimum_required (VERSION 2.8)
project (demo)
//将SRC_LIST 变量设置为testFunc.c的路径。
set (SRC_LIST ${PROJECT_SOURCE_DIR}/textFunc/testFunc.c)
//生成静态库,第一个参数为指定库的名字,第二个参数决定是动态还是静态,第三个指定生成库的源文件。
add_library(testFunc_shared SHARED ${SRC_LIST })
add_library(testFunc_static STATIC ${SRC_LIST })
//设置最终生成的库的名称,还有其他功能,如设置库的版本号等。
set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")
//设置库文件保存的地方
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
最终在bin文件夹下生成动态库libtestFunc.so和静态库libtestFunc.a
4.2 库文件的链接
cmake_minimum_required (VERSION 2.8)
project (demo)
//可执行文件保存的地方
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
//设置变量SRC_LIST 的值
set (SRC_LIST ${PROJECT_SOURCE_DIR}/src/main.c)
#包含头文件目录
include_directories(${PROJECT_SOURCE_DIR}/testFunc/inc)
//到指定目录下去寻找testFunc(testFunc 默认为动态库文件,若要使用指定静态则使用testFunc.a)库文件
//使用find_library的好处是在执行cmake …时就会去查找库是否存在,这样可以提前发现错误,不用等到链接时。
find_library(TESTFUN_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)
//这里也可以使用add_executable(main main.c)
add_executable(main ${SRC_LIST})
//将目标文件与库文件进行链接
target_link_libraries(main ${TESTFUN_LIB })
查看elf文件使用了哪些库,可以使用readelf -d ./xx来查看 例:readelf -d ./main
5. 总结
Cmake的知识点还有很多,这里只是简单的入门。
参考资料
https://subingwen.cn/cmake/CMake-primer/