CMake笔记之通用模板以及将官方库作为third_party完整地包含在工程项目中使用
—— 杭州 2024-03-20 凌晨1:06
code review!
文章目录
- CMake笔记之通用模板以及将官方库作为third_party完整地包含在工程项目中使用
- 1.通用CMakeLists.txt模板
- 2.GPT4给出的改进建议
- 3.git clone或apt-get install的官方库,以zlib库为例
- 3.1.获取zlib库
- 3.2.找到头文件和库文件的位置并拷贝至工程项目
- 3.3.CMakeLists.txt
- 3.4.此时的文件结构
- 3.5.main.cpp
- 3.6.编译运行
- 4.简单地将克隆的git clone下的目录放在项目树中的某个位置,以Google Test为例
- 4.1.git clone
- 4.2.CMakeLists.txt
- 4.3.main.cpp
- 4.4.编译运行
- 5.在CMakeLists.txt文件中执行git clone(略,个人没用过,但知道有这个方法)
- 6.找到该库的头文件(用于编译时包含)和链接库(用于链接时使用)的方法
- 7.包含可执行文件的库,如protobuf移植到自己的项目文件夹中
- 7.1.找到可执行文件和lib文件夹的路径
- 7.2.创建third_party目录
- 7.3.拷贝相关文件
- 7.4.文件结构
- 7.5.CMakeLists.txt
- 7.6.main.cpp
- 7.7.hello.proto
- 7.8.编译运行
- 7.9.在build文件夹内可以找到编译出来的pb.cc和pb.h
1.通用CMakeLists.txt模板
代码
# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.0)# 设置项目名称和版本
project(MyProject)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 假设你的库文件名为libmylibrary.a (静态库) 或 libmylibrary.so (动态库)
# 并且库文件位于项目的third_party目录下# 添加自己的库的头文件目录
include_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/include)# 添加自己的库的库目录
link_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/lib)# 指定生成目标
add_executable(${PROJECT_NAME} src/main.cpp)# 链接库到你的可执行文件
target_link_libraries(${PROJECT_NAME} mylibrary)
2.GPT4给出的改进建议
这个CMakeLists.txt
文件看上去基本是正确的,但是有几个小地方可能需要根据具体情况进行调整。以下是一个加了注释和可能需要注意的地方的版本:
# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.0)# 设置项目名称和版本
project(MyProject VERSION 1.0.0) # 如果你需要指定版本号,应该这样设置# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True) # 确保使用了C++11# 假设你的库文件名为libmylibrary.a (静态库) 或 libmylibrary.so (动态库)
# 并且库文件位于项目的third_party目录下# 添加自己的库的头文件目录
include_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/include)# 添加自己的库的库目录
# 注意: 在现代CMake中,更推荐使用target_link_directories和target_link_libraries结合使用
# link_directories应该尽量避免使用,因为它是全局的,会影响所有的target
link_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/lib)# 指定生成目标
add_executable(${PROJECT_NAME} src/main.cpp)# 链接库到你的可执行文件
# 如果mylibrary是第三方库,且你没有使用add_subdirectory或find_package来包含它,
# 你可能需要使用find_library来查找库文件的确切位置
target_link_libraries(${PROJECT_NAME} mylibrary)
注意事项:
- 如果你有多个版本的
mylibrary
库,并且希望确保链接到正确的版本,可能需要更详细地指定库文件的路径或版本。 - 如果
mylibrary
是动态链接库,确保在运行时它可以在系统的库路径中找到,或者设置LD_LIBRARY_PATH
环境变量等。 - 如果是跨平台项目,一些路径可能需要根据操作系统进行调整,例如使用
CMAKE_PREFIX_PATH
。 - 现代CMake推荐使用target-specific命令如
target_include_directories
和target_