学校网站建设情况利用关键词进网站后台
在 CMake 中,生成静态库(Static Library)或动态库(Shared Library)非常简单。CMake 提供了 add_library 命令来定义库文件,并通过参数指定库的类型(静态库或动态库)。以下是详细的步骤和示例:
1. 生成静态库
静态库在编译时会被完整地链接到可执行文件中,生成的文件扩展名通常为 .lib(Windows)或 .a(Linux/macOS)。
示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)# 添加静态库
add_library(MyStaticLibrary STATIC src/utils.cpp)# 设置静态库的输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
说明
add_library(MyStaticLibrary STATIC src/utils.cpp):MyStaticLibrary是库的名称。STATIC表示生成静态库。src/utils.cpp是库的源文件。
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:用于设置静态库的输出目录。
2. 生成动态库
动态库在运行时被加载,生成的文件扩展名通常为 .dll(Windows)或 .so(Linux/macOS)。
示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)# 设置动态库的输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
说明
add_library(MySharedLibrary SHARED src/utils.cpp):MySharedLibrary是库的名称。SHARED表示生成动态库。src/utils.cpp是库的源文件。
CMAKE_LIBRARY_OUTPUT_DIRECTORY:用于设置动态库的输出目录。
3. 同时生成静态库和动态库
如果需要同时生成静态库和动态库,可以定义两个不同的目标:
示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)# 添加静态库
add_library(MyStaticLibrary STATIC src/utils.cpp)# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 静态库
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 动态库
4. 设置库的版本和导出符号
对于动态库,通常需要设置版本号和导出符号。
示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)# 设置库的版本号
set_target_properties(MySharedLibrary PROPERTIESVERSION 1.0.0SOVERSION 1
)# 导出符号(Windows 下需要)
if (WIN32)target_compile_definitions(MySharedLibrary PRIVATE MYSHAREDLIBRARY_EXPORTS)
endif()
说明
VERSION和SOVERSION:用于设置库的版本号。target_compile_definitions:在 Windows 下,通常需要导出符号(通过__declspec(dllexport))。
5. 链接库文件
生成库文件后,可以在其他目标中链接这些库。
示例代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 添加可执行文件
add_executable(MyProgram main.cpp)# 链接静态库
target_link_libraries(MyProgram MyStaticLibrary)# 或者链接动态库
target_link_libraries(MyProgram MySharedLibrary)
6. 完整示例
以下是一个完整的示例,展示如何生成静态库和动态库,并在可执行文件中链接它们:
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 静态库
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 动态库
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 可执行文件# 添加静态库
add_library(MyStaticLibrary STATIC src/utils.cpp)# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)# 设置动态库的版本号
set_target_properties(MySharedLibrary PROPERTIESVERSION 1.0.0SOVERSION 1
)# 添加可执行文件
add_executable(MyProgram main.cpp)# 链接静态库
target_link_libraries(MyProgram MyStaticLibrary)# 或者链接动态库
target_link_libraries(MyProgram MySharedLibrary)
7. 构建项目
在项目根目录下运行以下命令来构建项目:
mkdir build
cd build
cmake ..
cmake --build .
构建完成后:
- 静态库会生成在
build/lib/目录下(如libMyStaticLibrary.a或MyStaticLibrary.lib)。 - 动态库会生成在
build/lib/目录下(如libMySharedLibrary.so或MySharedLibrary.dll)。 - 可执行文件会生成在
build/bin/目录下。
总结
- 使用
add_library生成静态库(STATIC)或动态库(SHARED)。 - 通过
CMAKE_ARCHIVE_OUTPUT_DIRECTORY和CMAKE_LIBRARY_OUTPUT_DIRECTORY设置库的输出目录。 - 使用
target_link_libraries链接库文件到可执行文件。 - 动态库可以设置版本号和导出符号(特别是在 Windows 下)。
