CMake编译和调用库的资料汇总

文章目录

    • Windows环境
      • 静态库.lib
        • 生成
        • 调用
      • 动态库.dll
        • 生成
        • 调用
    • Linux环境
      • 静态库.a
        • 生成
        • 调用
      • 动态库.so
        • 生成
        • 调用

为了便于区分生成的库是Debug或Release版本,建议在CMakeLists.txt里添加如下语句:

set(CMAKE_DEBUG_POSTFIX d)

此句表示Debug版本的库名会加上后缀“d”。例如,预期的库名为add,则生成的Debug版本的Windows静态库为addd.lib。

linux环境下默认编译release版本,若需要编译debug版本,可添加以下语句:

set(CMAKE_BUILD_TYPE debug)

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会导致报错。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值