组织一个C++共享库的项目架构,并编写相应的 CMakeLists.txt
文件。以下是一个常见的项目结构示例以及详细的 CMakeLists.txt
内容。
项目目录结构
MySharedLibrary/
├── CMakeLists.txt
├── include/
│ └── MySharedLibrary/
│ ├── MyClass.h
│ └── ... (其他头文件)
├── src/
│ ├── MyClass.cpp
│ └── ... (其他源文件)
├── tests/
│ ├── CMakeLists.txt
│ └── test_MyClass.cpp
├── examples/
│ ├── CMakeLists.txt
│ └── example.cpp
├── third_party/
│ └── ... (第三方库,如果有)
└── README.md
目录说明:
- CMakeLists.txt: 项目的顶层CMake配置文件。
- include/: 存放公共头文件,供外部使用。
- MySharedLibrary/: 为了避免头文件命名冲突,通常会在
include/
下创建一个以库名命名的子目录。
- MySharedLibrary/: 为了避免头文件命名冲突,通常会在
- src/: 存放源文件。
- tests/: 存放测试代码。
- examples/: 存放示例代码,展示如何使用你的库。
- third_party/: 存放第三方依赖库(如果有)。
- README.md: 项目说明文件。
顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.14)# 项目名称和版本
project(MySharedLibrary VERSION 1.0.0 LANGUAGES CXX)# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 设置生成共享库
add_library(MySharedLibrary SHAREDsrc/MyClass.cpp# 这里可以添加更多源文件
)# 指定头文件搜索路径
target_include_directories(MySharedLibraryPUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>
)# 设置库的版本信息(可选)
set_target_properties(MySharedLibrary PROPERTIESVERSION ${PROJECT_VERSION}SOVERSION 1PUBLIC_HEADER include/MySharedLibrary/MyClass.h
)# 定义安装规则
include(GNUInstallDirs)install(TARGETS MySharedLibraryEXPORT MySharedLibraryTargetsLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/MySharedLibrary
)# 导出库的使用配置
install(EXPORT MySharedLibraryTargetsFILE MySharedLibraryTargets.cmakeNAMESPACE MySharedLibrary::DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MySharedLibrary
)# 生成配置文件用于find_package
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/MySharedLibraryConfigVersion.cmake"VERSION ${PROJECT_VERSION}COMPATIBILITY AnyNewerVersion
)configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/MySharedLibraryConfig.cmake.in"${CMAKE_CURRENT_BINARY_DIR}/MySharedLibraryConfig.cmake"INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MySharedLibrary
)install(FILES"${CMAKE_CURRENT_BINARY_DIR}/MySharedLibraryConfig.cmake""${CMAKE_CURRENT_BINARY_DIR}/MySharedLibraryConfigVersion.cmake"DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MySharedLibrary
)# 启用测试(如果使用CTest)
enable_testing()
add_subdirectory(tests)# 添加示例(可选)
add_subdirectory(examples)
配置文件模板 cmake/MySharedLibraryConfig.cmake.in
你需要在项目根目录下创建一个 cmake/
目录,并在其中创建 MySharedLibraryConfig.cmake.in
文件,内容如下:
@PACKAGE_INIT@find_dependency(其他依赖库)include("${CMAKE_CURRENT_LIST_DIR}/MySharedLibraryTargets.cmake")
示例 tests/CMakeLists.txt
# tests/CMakeLists.txt
add_executable(test_MyClass test_MyClass.cpp)
target_link_libraries(test_MyClass PRIVATE MySharedLibrary)# 添加测试
add_test(NAME TestMyClass COMMAND test_MyClass)
示例 examples/CMakeLists.txt
# examples/CMakeLists.txt
add_executable(example example.cpp)
target_link_libraries(example PRIVATE MySharedLibrary)
示例源文件
include/MySharedLibrary/MyClass.h
#ifndef MYSHAREDLIBRARY_MYCLASS_H
#define MYSHAREDLIBRARY_MYCLASS_Hnamespace MySharedLibrary {class MyClass {
public:MyClass();void doSomething();
};} // namespace MySharedLibrary#endif // MYSHAREDLIBRARY_MYCLASS_H
src/MyClass.cpp
#include "MySharedLibrary/MyClass.h"
#include <iostream>namespace MySharedLibrary {MyClass::MyClass() {// 构造函数实现
}void MyClass::doSomething() {std::cout << "Doing something!" << std::endl;
}} // namespace MySharedLibrary
构建和安装
-
创建构建目录并进入
mkdir build cd build
-
运行CMake配置
cmake ..
如果你希望安装到指定目录,例如
/usr/local
,可以指定CMAKE_INSTALL_PREFIX
:cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
-
编译项目
cmake --build .
-
运行测试
ctest
-
安装库
cmake --install .
其他建议
- 版本控制:使用Git等版本控制系统来管理你的项目代码。
- 文档:编写详细的文档和使用示例,方便用户理解和使用你的库。
- 持续集成:考虑使用CI工具(如GitHub Actions、Travis CI等)自动化构建和测试。
- 代码质量:使用工具如
clang-tidy
、cppcheck
进行静态代码分析,确保代码质量。