自学内容网 自学内容网

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配置如下:

  1. 属性页–>配置属性–>常规–>配置类型–>静态库(.lib)
  2. 属性页–>配置属性–>高级–>目标文件扩展名–>.lib
调用
  1. 将静态库.lib拷贝到工程文件夹内。
  2. 属性页–>配置属性–>链接器–>输入–>附加依赖项–>(输入.lib所在路径)

动态库.dll

生成

生成动态库.dll的CMakeLists.txt与生成静态库.lib的一样,但头文件中函数声明前需要加:

external"C" __declspec(dllexport)

Visual Studio配置如下:

  1. 属性页–>配置属性–>常规–>配置类型–>动态库(.dll)
  2. 属性页–>配置属性–>高级–>目标文件扩展名–>.dll
调用
  1. 将动态库的.lib拷贝到工程文件夹内。(生成的动态库包括.dll和一个较小的.lib)
  2. 属性页–>配置属性–>链接器–>输入–>附加依赖项–>(输入.lib所在路径)
  3. 将.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)!