CMake的add_library与target_link_libraries

一、add_library介绍

使用该命令可以在Linux下生成(静态/动态)库so或者.a文件,Windows下就是dll与lib文件,它有两种命令格式

1.1 第一种格式 :

 Normal Libraries,add_library命令的格式为

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

生成一个名为 < name > 的library,注意以下规则:

  1. < name > 应该保证在一个项目中的唯一性。
  2. 实际生成的library文件名是基于平台的约定规则,比如linux下的lib< name >.a, Windows下的< name >.lib等
  3. STATIC,SHARED,MODULE用于指定创建的library类型。
  4. STATIC库:生成obj文件后,将其链接成静态库,用于链接到其他targets。
  5. SHARED库:生成obj文件后,将其链接成动态库,用于运行时加载。
  6. MODULE库:不能链接到其他targets,但是可以用dlopen之类的方法在运行时动态加载。
  7. 如果没有明确指定要生成的library的类型到底是STATIC,SHARED还是MODULE。则查看BUILD_SHARED_LIBS变量,如果值为ON,则默认是SHARED,否则默认STATIC。
  8. 对于SHARED和MODULE类型的库,POSITION_INDEPENDENT_CODE属性自动置为ON。
  9. EXCLUDE_FROM_ALL:表明该target是否从默认构建target中排除。
  10. source参数可以使用generator表达式($ <…>)。

 1.2 第二种格式 :

生成一个obj文件对象,该对象库只编译源文件,但不链接。

add_library(<name> OBJECT [<source>...])

由add_library()或 add_executable()创建的目标可以使用$<TARGET_OBJECTS:name>这样的表达式作为源引用对象,其中,name是对象库的名称。格式如下:

add_library(... $<TARGET_OBJECTS:name> ...)
add_executable(... $<TARGET_OBJECTS:name> ...)

 二、target_link_libraries的介绍

指定链接给定目标和/或其依赖项时要使用的库。命名的<tartget>必须是由add_executable()或add_library()之类的命令创建的。一般与 link_directories连用(添加外部库的搜索路径 )

target_link_libraries命令的格式

target_link_libraries(<target> ... <item>... ...)

三、add_library的实例

四个文件hello.h,hello.cpp,main.cpp,CMakelist.txt,目录如下

 hello.h

#include <string>
 
void test(std::string str);

hello.cpp

#include "hello.h"
#include <iostream>
 
void test(std::string str)
{
    std::cout << str << std::endl;
}

main.cpp

#include "hello.h"
#include <iostream>
 
int main(int argc, char** argv)
{
    std::cout << "In main..." << std::endl;
    test("hello, world!");
    return 0;
}

 CMakeList文件

第一种library格式

cmake_minimum_required (VERSION 3.12.1)

project (Demo)

# 生成对象库文件
add_library(hello hello.cpp)

# 添加头文件目录
target_include_directories(hello PUBLIC ${CMAKE_SOURCE_DIR}/public)

# 生成可执行文件
add_executable(Demo main.cpp)

# 链接对象库
target_link_libraries(Demo hello)

第二种library格式

cmake_minimum_required (VERSION 3.12.1)

project (Demo)

# 生成对象库文件
add_library(hello OBJECT hello.cpp)

# 添加头文件目录
target_include_directories(hello PUBLIC ${CMAKE_SOURCE_DIR}/public)

# 添加编译选项 -Wall
target_compile_options(hello PUBLIC -Wall)

# 生成可执行文件
add_executable(Demo main.cpp $<TARGET_OBJECTS:hello>)

# 添加头文件目录
target_include_directories(Demo PUBLIC ${CMAKE_SOURCE_DIR}/public)

编译,运行

 另一种写法

cmake_minimum_required (VERSION 3.12.1)

project (Demo)

# 生成对象库文件,不链接
add_library(hello OBJECT hello.cpp)

# 添加头文件目录
target_include_directories(hello PUBLIC ${CMAKE_SOURCE_DIR}/public)

# 添加编译选项 -Wall
target_compile_options(hello PUBLIC -Wall)

# 生成可执行文件
add_executable(Demo main.cpp)

# 链接对象库
target_link_libraries(Demo hello)

编译,运行

大家习惯通过 $<TARGET_OBJECTS:name>引用object文件。其实object library与静态库,动态库一样,都是可以设置PUBLIC/PRIVATE属性的,再通过target_link_library()命令链接

参考:

add_library — CMake 3.22.0 Documentation

target_link_libraries — CMake 3.22.0 Documentation

cmake指令基础知识_ShawnRacine的博客-CSDN博客
cmake使用示例与整理总结_carl_wang_cn的博客-CSDN博客_cmake使用示例与整理总结

  • 35
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
add_libraryCMake中的一个指令,用于将源文件编译成库文件。它的语法如下: ```cmake add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) ``` 其中,name是库文件的名称,可以是任意字符串;STATIC、SHARED和MODULE是可选参数,用于指定库文件的类型,默认为STATIC;EXCLUDE_FROM_ALL是可选参数,用于指定该库文件是否被包含在ALL选项中,默认为不包含;source1、source2等是源文件的路径。 find_libraryCMake中的一个指令,用于查找指定的库文件。它的语法如下: ```cmake find_library(<VAR> name1 [path1 path2 ...]) ``` 其中,VAR是一个变量,用于存储找到的库文件的路径;name1是要查找的库文件的名称;path1、path2等是可选参数,用于指定查找库文件的路径。 target_link_librariesCMake中的一个指令,用于将目标文件与库文件进行链接。它的语法如下: ```cmake target_link_libraries(<target> [item1] [item2] [...]) ``` 其中,target是通过add_executable()和add_library()指令生成的目标文件;item1、item2等是要链接的库文件的名称。 以下是一个示例,演示了如何使用add_library、find_librarytarget_link_libraries指令: ```cmake # 添加一个名为mylib的库文件 add_library(mylib SHARED mylib.cpp) # 查找名为mylib的库文件 find_library(MYLIB_LIB mylib) # 添加一个名为myapp的可执行文件,并将其与mylib库文件进行链接 add_executable(myapp main.cpp) target_link_libraries(myapp ${MYLIB_LIB}) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值