cmake 动态库 静态库的区别
时间: 2023-12-19 21:30:09 浏览: 113
CMake是一个跨平台的自动化构建系统,可以用于管理项目的编译过程。在CMake中,动态库和静态库是有区别的。
静态库是在编译时将库的代码和可执行文件链接在一起,形成一个完整的可执行文件。因此,静态库的大小比较大,但是执行时不需要依赖外部库文件。
动态库是在运行时才被加载到内存中,因此动态库的大小比较小,但是执行时需要依赖外部库文件。动态库可以被多个程序共享,因此可以减少内存的占用。
在CMake中,可以使用add_library命令来创建静态库和动态库。对于静态库,可以使用以下命令:
```cmake
add_library(mylib STATIC ${SRC_FILES})
```
对于动态库,可以使用以下命令:
```cmake
add_library(mylib SHARED ${SRC_FILES})
```
其中,${SRC_FILES}是库的源代码文件。
相关问题
cmake 动态库链接静态库
CMake是一个跨平台的构建系统管理工具,用于自动化构建、测试和打包软件项目。在处理动态库(DLLs 或.so)和静态库(lib 文件)的链接时,CMake提供了灵活的方式来设置编译选项。
当你想要动态链接静态库时,通常是为了利用静态库中的代码,但避免了运行时加载的性能开销。这可以通过以下步骤在CMakeLists.txt文件中配置:
1. **添加静态库**:
在CMakeLists.txt中,使用`find_library`或`add_library`命令找到静态库,例如:
```cmake
find_library(STATIC_LIB_NAME STATIC PATHS /path/to/library)
target_link_libraries(YOUR_TARGET ${STATIC_LIB_NAME})
```
2. **设置库类型为SHARED**:
尽管你在链接目标时指定的是静态库,但你需要将链接类型设为SHARED,这样编译器会生成可执行文件来导入动态链接的符号:
```cmake
set_target_properties(YOUR_TARGET PROPERTIES OUTPUT_NAME new_output_name)
add_library(${YOUR_TARGET} SHARED IMPORTED)
```
3. **导入静态库符号**:
使用`target_link_with_library`将静态库的内容导入到可执行文件中:
```cmake
target_link_with_library(YOUR_TARGET INTERFACE ${STATIC_LIB_NAME})
```
4. **生成最终可执行文件**:
最后,使用`install`命令安装可执行文件并确保动态链接正确。
注意,这种做法并不是标准的行为,因为通常动态链接对应动态库是预期的。然而,在某些特定情况下,如某些库不支持动态链接或者对性能有特殊需求时,可能会采用这种方式。
cmake 动态库和静态库的区别
### CMake 构建动态库与静态库的区别
#### 定义和特性
动态库(Shared Library)是在程序运行时加载到内存中的共享资源,多个应用程序可以同时使用同一个副本。这减少了磁盘空间占用并允许更新单一位置来影响所有依赖的应用程序[^2]。
静态库(Static Library)则是在编译阶段被链接进可执行文件内部的一部分,在最终生成的二进制文件中包含了该库的所有代码。这意味着每个使用此静态库创建出来的独立应用都会携带一份完整的库拷贝[^1]。
#### 创建过程差异
对于动态库而言,通过`add_library()`命令指定第二个参数为`SHARED`,告知CMake需要构建的是一个动态库:
```cmake
add_library(my_shared SHARED src/mylib.cpp)
```
而针对静态库,则将第二参数设成`STATIC`:
```cmake
add_library(my_static STATIC src/mystaticlib.cpp)
```
当省略第二个参数,默认情况下会按照平台惯例处理——通常意味着创建静态库。
#### 文件形式不同
在Linux/Unix环境下,动态库一般具有`.so`(shared object)扩展名;而在Windows上则是`.dll`(Dynamic Link Library)[^3]。相对应地,静态库分别对应于`.a` (archive file) 和 `.lib` 扩展名。
#### 链接方式的不同
使用静态库时,目标文件会被直接嵌入至最终产物之中,因此不需要额外分发任何其他支持文件给终端用户即可正常工作。
相反,采用动态库的情况下,除了提供主程序外还需要附带相应的.so 或 .dll 文件以便于运行期间能够找到这些外部依赖项完成加载操作。
阅读全文