CMake编译和调用库的资料汇总
文章目录
- Windows环境
- 静态库.lib
- 生成
- 调用
- 动态库.dll
- 生成
- 调用
- Linux环境
- 静态库.a
- 生成
- 调用
- 动态库.so
- 生成
- 调用
为了便于区分生成的库是Debug或Release版本,建议在CMakeLists.txt里添加如下语句:
set(CMAKE_DEBUG_POSTFIX d)
此句表示Debug版本的库名会加上后缀“d”。例如,预期的库名为add,则生成的Debug版本的Windows静态库为addd.lib。
Windows环境
静态库.lib
生成
生成静态库的CMakeLists.txt相关配置如下:
set(LIB_NAME abc)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) %配置头文件搜索路径
set(LIB_SRC_REGEX ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c) %索引全部源文件
set(LIB_HEADER_REGEX ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h) %索引全部头文件
file(GLOB_RECURSE LIB_SRC ${LIB_SRC_REGEX}) %递归查找,获取文件列表
file(GLOB_RECURSE LIB_HEADER ${LIB_HEADER_REGEX}) %递归查找,获取文件列表
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${LIB_SRC}) %按目录结构生成Visual Studio的filter
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${LIB_HEADER})
add_library(${LIB_NAME} ${LIB_SRC} ${LIB_HEADER}) %生成库
Visual Studio配置如下:
- 属性页–>配置属性–>常规–>配置类型–>静态库(.lib)
- 属性页–>配置属性–>高级–>目标文件扩展名–>.lib
调用
- 将静态库.lib拷贝到工程文件夹内。
- 属性页–>配置属性–>链接器–>输入–>附加依赖项–>(输入.lib所在路径)
动态库.dll
生成
生成动态库.dll的CMakeLists.txt与生成静态库.lib的一样,但头文件中函数声明前需要加:
external"C" __declspec(dllexport)
Visual Studio配置如下:
- 属性页–>配置属性–>常规–>配置类型–>动态库(.dll)
- 属性页–>配置属性–>高级–>目标文件扩展名–>.dll
调用
- 将动态库的.lib拷贝到工程文件夹内。(生成的动态库包括.dll和一个较小的.lib)
- 属性页–>配置属性–>链接器–>输入–>附加依赖项–>(输入.lib所在路径)
- 将.dll拷贝到项目.sln所在目录下。
Linux环境
静态库.a
生成
生成静态库.a的CMakeLists.txt与Windows环境生成静态库.lib的一样。
调用
在add_excecutable语句后面加以下语句:
target_link_libraries(${TEST_NAME} PRIVATE -L${CMAKE_CURRENT_SOURCE_DIR}/lib abc.a)
(1) "TEST_NAME"为target,一般是可执行程序。
(2) “PRIVATE”表示后面的库仅被link到该target中,库的生命周期仅存在于target中,不能被第三方感知。
(3) ”-L“后没有空格,直接跟库所在的路径。
动态库.so
生成
生成动态库.so的CMakeLists.txt与Windows环境生成静态库.lib的基本一样,只需要修改以下语句:
add_library(${LIB_NAME} SHARED ${LIB_SRC} ${LIB_HEADER}) %生成库,增加“SHARED”
调用
在add_excecutable语句后面加以下语句:
set(LINK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib)
target_link_libraries(${TEST_NAME} ${LINK_DIR}/abc.so)
动态库.so的调用需要先设置路径(LINK_DIR),再执行target_link_libraries.将两个步骤合并到target_link_libraries会导致报错。
原文地址:https://blog.csdn.net/allen_sdz/article/details/136463357
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!