目录
参考文档
运行环境
2022年12月
MBP M1
macOS Big Sur 11.4
cmake 3.21.3
项目目录
- 本质上构建项目的代码由CMakeList.txt来指定,所以目录怎么设计都可以,拍平都没问题,我分这么多目录只是为了结构清晰。
- 把头文件单独放置在开发时会很不方便,但封装发布或者被引用的时候看起来会比较规范。
.
├── CMakeLists.txt
├── demo
│ ├── CMakeLists.txt
│ └── demo.cpp
└── lib
├── CMakeLists.txt
├── include
│ └── tkport
│ └── tkport.hpp
└── src
└── tkport
└── tkport.cpp
库文件
- 库的源码内容可以自由发挥,我这里实现一个简单的打印函数,后续测试时会比较方便。
// ./lib/include/tkport/tkport.hpp
#ifndef tkport_hpp
#define tkport_hpp
#include <iostream>
using namespace std;
class tkport {
private:
string message;
public:
tkport(string message);
void show();
};
#endif /* tkport_hpp */
// ./lib/src/tkport/tkport.cpp
#include <tkport/tkport.hpp>
tkport::tkport(string message) {
this->message = message;
}
void tkport::show() {
cout << message << endl;
}
# ./lib/CMakeLists.txt
# 定义文件路径的相关变量
set(PROJECT_BASE_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/include)
file(GLOB_RECURSE PROJECT_BASE_INCLUDE_LIST include/**/*.hpp)
file(GLOB_RECURSE PROJECT_BASE_SRC_LIST src/**/*.cpp)
# 添加二进制文件,声明文件名及其源码内容
add_library(
${PROJECT_NAME} STATIC
${PROJECT_BASE_INCLUDE_LIST}
${PROJECT_BASE_SRC_LIST}
)
# 设置编译选项
set_target_properties(
${PROJECT_NAME}
PROPERTIES
LINKER_LANGUAGE CXX
CXX_STANDARD 17
)
# 添加头文件引用
target_include_directories(
${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${PROJECT_BASE_INCLUDE}>
)
示例文件
- 示例内容主要用来构建可执行文件,即一个测试库文件的Demo。
// ./demo/demo.c
#include <tkport/tkport.hpp>
int main() {
tkport tkport = tkport("Hellp CMake!");
tkport.show();
return 1;
}
# ./demo/CMakeLists.txt
set(DEMO_NAME demo)
add_executable(${DEMO_NAME} demo.cpp)
target_link_libraries(${DEMO_NAME} ${PROJECT_NAME})
set_target_properties(
${DEMO_NAME}
PROPERTIES
LINKER_LANGUAGE CXX
CXX_STANDARD 17
)
根目录文件
- 用于整合声明、构建库文件和示例文件
# ./CMakeLists.txt
# 本项目构件所须的CMake最低版本号
cmake_minimum_required (VERSION 3.5)
# 配置项目信息
project(
tkport # 项目名,会被保存到 PROJECT_NAME 变量
VERSION 0.9.11 # 项目版本号(库版本)
LANGUAGES CXX # 项目开发语言
)
add_subdirectory(lib)
# 如果构建时BUILD_DEMO参数为true,则构建可执行示例
if(BUILD_DEMO)
add_subdirectory(demo)
endif()
构建运行
- 在根目录创建 build 文件夹
- 执行命令
$ cmake -B build -DBUILD_DEMO=true
$ cmake --build build
- 检查构建结果
- 二进制库文件:
./build/lib/libtkport.a
- 可执行示例文件:
./build/demo/demo
- 运行主项目可执行文件
$ build/demo
Hellp CMake!