写过一篇 发表于 2026-2-11 23:38:57

cmake 编译教程

参考链接:cmake使用详细教程(一样平常使用这一篇就充足了)_cmake教程-CSDN博客

 一、只有一个源文件的步调编译

起首在当前目次下创建两个文件

hello.cpp

CMakeLists.txt (注意CMakeLists巨细写,不要写错了)

cmake_minimum_required (VERSION 2.8)

project (learn_cmake)

add_executable(hello hello.cpp)

[*]第一行意思是cmake最低版本要求2.8,
[*]第二行是本项目的工程名
[*]第三行:第一个变量:要天生的可实行文件名为hello,背面的参数是须要的依赖。
接着在当前目次下实行 cmake . 接着会发现目次下多天生了一些文件,比方Makefile,然后使用GNU make下令来编译步调,会天生可实行步调。

二、同一目次下多个源文件

此时在当前目次新增两个依赖,并mian函数的实行须要依赖这两个文件
add.cpp
add.h
只须要在CMakeLists.txt中添加所依赖的.cpp文件,编译步调和上面雷同。
cmake_minimum_required (VERSION 2.8)

project (learn_cmake)

add_executable(hello hello.cpp myadd.cpp) 三、同一目次下许多源文件




如果同一目次下有无穷多源文件,那么一个一个添加就很慢了。此时可以使用cmake中的函数存储这些源文件
aux_source_directory(dir var)
他的作用是把dir目次中的全部源文件都储存在var变量中
然后须要用到源文件的地方用 变量var来取代
此时 CMakeLists.txt 可以如许优化
cmake_minimum_required(VERSION 2.8)

project(learn_cmake)

aux_source_directory(. SRC_LIST)

add_executable(hello ${SRC_LIST})
四、头文件在别的文件夹

对于会集的头文件,CMake提供了一个很方便的函数
include_directories ( dir )
他的作用是 自动去dir目次下探求头文件,相称于 gcc中的 gcc -I dir
此时 CMakeLists.txt 可以如许优化
cmake_minimum_required(VERSION 2.8)

project(learn_cmake)

aux_source_directory(. SRC_LIST)

include_directories(./inc_dir)

add_executable(hello ${SRC_LIST})  五、头文件源文件分离,并含有多个文件夹

如果说当前的工程目次是如许的,头文件和源文件分离,并含有多个文件夹
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNzhhMjdmZDA1MGU2NDJkYmJlMTQwODEyOTg3NTQxNWQucG5n
此时 CMakeLists.txt 可以如许优化
cmake_minimum_required(VERSION 2.8)

project(learn_cmake)

aux_source_directory(src_dir1 SRC_LIST1)
aux_source_directory(src_dir2 SRC_LIST2)
aux_source_directory(main_dir MAIN_DIR)

include_directories(./inc_dir1 ./inc_dir2)

add_executable(hello ${SRC_LIST1} ${SRC_LIST2} ${MAIN_DIR}) 六、天生动态库和静态库

如果说当前的项目目次是如许的


[*]inc目次下存放头文件
[*]src目次下存放源文件
[*]lib目次下存放天生的库
[*]build目次下存放构建项目相干的文件,如CMakeLists.txt。而稍后我们也在这个目次下实行cmake和make
 https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYjQwYTY4ZjE3YzE0NDhiYWE4M2NkYjdjZDU3MWY0NjgucG5n
 此时 CMakeLists.txt 可以如许优化
cmake_minimum_required(VERSION 2.8)

project(learn_lib)

#整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST)

#引入头文件路径
include_directories(${PROJECT_BINARY_DIR}/../inc)

#生成静态库或者动态库 参数1:生成的库的名称 参数2:静态或动态 参数3:生成库所需要的源文件
add_library(func_shared SHARED ${SRC_LIST})
add_library(func_static STATIC ${SRC_LIST})

#设置最终生成的库的名称
set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc")
set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc")

#设置生成的库的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib) 开始编译:

[*]在build目次下实行 cmake .
[*]在build目次下实行 make
[*]检察lib目次下是否天生库文件,
出现库文件就算编译乐成
七、链接库文件

库文件目次结构如下:


[*]lib目次下存放静态库和动态库
[*]main_src目次下存放main函数相干的源文件
[*]bin目次存放项目天生的可实行文件
 此时 CMakeLists.txt 可以如许写
cmake_minimum_required(VERSION 2.8)

project(learn_lib)

#整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../main_src MAIN_SRC)

#引入头文件路径
include_directories(${PROJECT_BINARY_DIR}/../inc)

#生成静态库或者动态库 参数1:生成的库的名称 参数2:静态或动态 参数3:生成库所需要的源文件
add_library(func_shared SHARED ${SRC_LIST})
add_library(func_static STATIC ${SRC_LIST})

#设置最终生成的库的名称
set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc")
set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc")

#设置生成的库的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)

#查找库文件 第一个参数:存储查找到的库文件 第二个参数:要查找的库文件 第三个参数:要查找的目录
find_library(FUNC_LIB myfunc ${PROJECT_BINARY_DIR}/../lib)

#设置可执行文件生成到哪里
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)

add_executable(hello ${MAIN_SRC})

target_link_libraries(hello ${FUNC_LIB}) 八、怎样选择动态库和静态库

选择天生动态库(Dynamic Link Library,DLL 在 Windows 上,Shared Object,.so 在 Unix/Linux 上,或 Dynamic Library,.dylib 在 macOS 上)照旧静态库(Library Archive,.a 或 .lib)紧张取决于以下几个因素:
动态库的长处:


[*]资源占用: 动态库在多个步调间共享雷同的代码,可以节流体系内存和磁盘空间,由于不须要为每个使用该库的应用步调复制整个库。
[*]更新方便: 更新动态库时,全部依赖它的应用步调都会自动使用新版本,无需重新编译或分发应用步调。
[*]模块化: 动态库可以更容易地实现模块化编程,允许在运行时加载或卸载库,加强步调的机动性和扩展性。
[*]性能: 只管启动时大概须要一些额外的时间来剖析动态库中的符号,但在频仍调用的环境下,动态链接大概会更快,由于它克制了静态链接中的冗余代码。
静态库的长处:


[*]摆设简单: 使用静态库的步调是自包罗的,不须要在目的呆板上存在额外的库文件。
[*]可靠性: 不会受到“依赖地狱”题目的影响,即不会由于缺少动态库大概动态库版本不匹配而导致步调瓦解。
[*]安全性: 克制了由于动态库被恶意更换而导致的安全风险。
[*]兼容性: 特殊是在嵌入式体系或资源受限的环境中,静态链接可以确保软件的完备性和最小化依赖。
选择战略:



[*]如果库的使用者须要淘汰终极可实行文件的分发复杂度,大概目的平台资源有限,静态库大概是更好的选择。
[*]如果库须要在多个应用之间共享,大概盼望简化库的更新流程,动态库更为符合。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
页: [1]
查看完整版本: cmake 编译教程