cmakelist编译动态库和静态库的区别
时间: 2023-08-13 16:25:38 浏览: 53
CMakeLists.txt 是 CMake 的构建脚本,用于自动生成 Makefile 或 Visual Studio 项目等编译工程。编译静态库和动态库的区别在于库文件的生成方式和使用方式。
编译静态库时,编译器会将所有相关的代码打包成一个文件,这个文件会被链接到可执行文件中。链接时会将静态库文件的代码复制到可执行文件中,因此可执行文件会变得较大。静态库的代码不能被多个进程共享,因此每个进程都需要有一份完整的静态库代码。
编译动态库时,编译器会将相关的代码打包成一个动态链接库文件,这个文件会被加载到内存中,可执行文件中只包含动态库的引用。多个进程可以共享同一个动态库,因此可以减少内存占用。但是,如果动态库的接口发生变化,需要重新编译和部署动态库文件。
在 CMake 中,编译静态库和动态库的方法类似,主要区别在于使用 add_library 命令时的参数。编译静态库时,使用 add_library 命令,将第一个参数设置为库名称,第二个参数设置为 STATIC。编译动态库时,将第二个参数设置为 SHARED。例如:
```
add_library(mylib STATIC mylib.cpp) # 编译静态库
add_library(mylib SHARED mylib.cpp) # 编译动态库
```
相关问题
cmakelist opencv动态库和静态库的调用区别
CMake是一个跨平台的开源构建系统,用于控制软件构建过程的自动化工具。在使用CMake构建OpenCV时,可以选择使用动态库或静态库。
动态库是在运行时加载的库,它允许多个应用程序共享同一个库。在使用动态库时,需要在CMakeLists.txt中添加以下内容:
```
find_package(OpenCV REQUIRED)
add_executable(myapp main.cpp)
target_link_libraries(myapp ${OpenCV_LIBS})
```
其中,find_package命令用于寻找OpenCV库,target_link_libraries命令用于链接OpenCV库。
静态库是在编译时链接到应用程序中的库,它将库的所有代码复制到应用程序中。在使用静态库时,需要在CMakeLists.txt中添加以下内容:
```
find_package(OpenCV REQUIRED)
add_executable(myapp main.cpp)
target_link_libraries(myapp ${OpenCV_STATIC_LIBS})
```
其中,target_link_libraries命令用于链接OpenCV静态库。需要注意的是,使用静态库会增加应用程序的大小,并且不支持多个应用程序共享同一个库。
因此,动态库和静态库的调用区别主要在于运行时加载和编译时链接的不同。使用动态库可以节省内存,支持多个应用程序共享同一个库,但需要在运行时加载;使用静态库可以避免库的版本问题,但会增加应用程序的大小。
cmake 命令行编译静态库
要使用CMake命令行编译静态库,首先需要安装好CMake。然后,在项目的根目录下创建一个CMakeLists.txt文件,用于指定头文件、源文件和库的名字等信息。接下来,使用命令行进入项目的build目录,并运行cmake命令来生成Makefile文件。最后,在build目录下运行make命令来编译生成静态库。
具体的步骤如下:
1. 安装CMake。
2. 在项目的根目录下创建一个CMakeLists.txt文件,并在文件中指定头文件、源文件和库的名字等信息。
3. 使用命令行进入项目的build目录,可以使用如下命令创建一个新的build目录并进入其中:
```
mkdir build
cd build
```
4. 在build目录下运行cmake命令,指定上一步创建的CMakeLists.txt文件的路径:
```
cmake ..
```
这将生成Makefile文件。
5. 最后,在build目录下运行make命令来编译生成静态库:
```
make
```
这将根据Makefile文件编译项目,并生成静态库。
请注意,以上步骤仅适用于在Linux环境下使用CMake编译静态库。对于其他平台,可能需要进行相应的调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [使用CMake编译跨平台静态库](https://blog.csdn.net/u012419410/article/details/39718425)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [CMake 常用总结二:CMake 生成静态库与动态库](https://blog.csdn.net/liuqingsongmsdn2014/article/details/129032343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]