cmake 静态连接
时间: 2024-07-31 11:01:37 浏览: 65
CMake是一个跨平台、开源的构建系统管理工具,用于生成自动化构建脚本(如Unix Makefile或Visual Studio项目文件)。静态链接是指程序中使用的库函数不是作为共享对象(DLLs/Dynamically Linked Libraries),而是直接嵌入到最终的可执行文件(Exe)中。
当你在CMake配置中选择静态链接(STATIC_LIBRARIES 或 `-DCMAKE_EXE_LINKER_FLAGS=-static`)时,CMake会确保编译后的应用程序包含了所有必要的库函数副本,这样即使在没有相应动态库的情况下也能运行。这种方式通常适用于以下情况:
1. **移植性**:静态链接使得应用程序更独立于目标系统的库环境,无需用户手动安装额外依赖。
2. **安全**:避免了因找不到动态库导致的运行时错误。
3. **部署简单**:不需要部署对应动态库。
然而,静态链接也可能会增加应用的大小,并可能导致性能下降,因为每份复制的库都会占用内存。此外,大型库可能会导致构建时间显著增长。
相关问题
cmake静态库连接动态库 darwin系统
在macOS系统中,使用CMake连接静态库和动态库的方式与其他操作系统大致相同。以下是连接静态库和动态库的步骤:
1. 编写CMakeLists.txt文件,声明需要连接的静态库和动态库,并指定头文件和库文件的路径。
2. 使用add_executable命令编译源代码生成可执行文件,并将需要连接的库文件添加到可执行文件中。
3. 使用target_link_libraries命令将需要连接的静态库和动态库链接到可执行文件中。
下面是一个示例的CMakeLists.txt文件,用于连接静态库和动态库:
```
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 指定头文件路径
include_directories(include)
# 指定静态库路径
link_directories(lib)
# 编译源代码生成可执行文件
add_executable(MyExecutable main.cpp)
# 将需要连接的静态库和动态库添加到可执行文件中
target_link_libraries(MyExecutable libMyStaticLibrary.a libMyDynamicLibrary.dylib)
```
在上面的示例中,我们假设需要连接一个名为libMyStaticLibrary.a的静态库和一个名为libMyDynamicLibrary.dylib的动态库。我们还假设这些库文件位于项目根目录下的lib目录中。
cmake 静态库的使用
在CMake中,构建静态库通常涉及以下几个步骤[^2]:
1. **使用ADD_LIBRARY**:通过`ADD_LIBRARY(<target_name> STATIC <source_files>)`命令创建静态库,其中`<target_name>`是你给库指定的名字,`STATIC`表示静态链接,`<source_files>`是包含库功能的源文件列表。
```cmake
ADD_LIBRARY(my_library STATIC src1.cpp src2.cpp)
```
2. **设置目标属性**:有时,你可能需要同时构建动态库和静态库,这时可以使用`SET_TARGET_PROPERTIES`。例如,设置同名动态库和静态库的版本信息:
```cmake
SET_TARGET_PROPERTIES(my_library PROPERTIES VERSION 1.0.0 SOVERSION 1)
```
3. **安装**:当项目构建完成后,可以使用`INSTALL(TARGETS <target> DESTINATION <install_path>)`命令安装库,包括头文件和库文件:
```cmake
INSTALL(FILES my_library.h DESTINATION include)
INSTALL(TARGETS my_library RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
```
4. **搜索路径**:使用`INCLUDE_DIRECTORIES`和`LINK_DIRECTORIES`添加非标准的头文件和库文件搜索路径,确保编译器能找到它们:
```cmake
INCLUDE_DIRECTORIES(/path/to/headers)
LINK_DIRECTORIES(/path/to/libraries)
```
5. **链接**:通过`TARGET_LINK_LIBRARIES`连接到其他库:
```cmake
TARGET_LINK_LIBRARIES(my_library other_library)
```
6. **编译条件和平台判断**:CMake允许你根据编译条件和平台选择不同的构建行为,这部分未在此详述,但它是CMake高级用法的一部分。
记住,每次更改CMakeLists.txt文件后,都需要运行`cmake`或`cmake-gui`重新配置项目。
阅读全文