[CMake教程] 引用外部链接库

目录

    • 一、基础示例
    • 二、使用CMAKE变量
    • 三、大型项目多库引用
    • 四、为什么不使用link_directories

有了链接库后要在源码中使用,target_link_libraries语句可以将库链接到可执行文件。

语法如下:

target_link_libraries(targetName library ... ...)

targetName 是要添加链接库的目标,并且必须由 add_executable()add_library() 创建,一定不能成为 ALIAS目标。
library 是要链接的库,可以是库的名字或库的完整(绝对)路径。

一、基础示例

导入链接库一个简单使用示例如下:

// main.c
#include 

int main()
{
    hello();

    return 0;
}

以使用CMake学习(二) ——生成链接库生成的链接库 libtest_2.a 为例:
链接库的源码 hello.c 为:

#include 

int hello()
{
    printf("hello CMake!\n");

    return 0;
}

链接库的头文件 hello.h 为:

#ifndef __HELLO_H__
#define __HELLO_H__

int hello();

#endif

CMakeLists.txt内容:

# CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required(VERSION 3.20)

# 项目名称
project(test_3)

# 添加头文件搜索目录(不优雅的示范)
include_directories(/home/vistar/Desktop/CMake-Learning/1.my-note/code/3.use-libraries/target_link_libraries)

# 指定生成目标 
add_executable(test_3 main.c)

# 链接库文件(不优雅的示范)
target_link_libraries(test_3 /home/vistar/Desktop/CMake-Learning/1.my-note/code/3.use-libraries/target_link_libraries/libtest_2.a)

运行结果为:

在这里插入图片描述

二、使用CMAKE变量

上述示例使用了链接库的绝对路径,但这样不是很优雅,并且一旦该工程的路径改变,CMakeLists.txt 中 所有绝对路径也需要修改。

可以使用CMAKE变量获取当前工程的路径,实现更优雅的cmake代码:

CMakeLists.txt 内容修改如下:

# CMake最低版本要求
cmake_minimum_required(VERSION 3.20)

# 项目名称
project(test_3)

# 添加头文件搜索目录(优雅的示范)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

# 指定生成目标
add_executable(test_3 main.c)

# 链接库文件(优雅的示范)
target_link_libraries(test_3 ${CMAKE_CURRENT_SOURCE_DIR}/libtest_2.a)

其中,CMAKE_CURRENT_SOURCE_DIR 是当前处理的 CMakeLists.txt 的绝对路径。

更多CMake的环境变量见 CMake变量 。

三、大型项目多库引用

对于大型项目,如果有很多库,建议放在 lib 目录下,并做好分类,如下:

文件结构:

.
├── build
├── CMakeLists.txt
├── include
│   └── hello.h
├── lib
│   │   lib1
│   │   └── libtest_1.a
│   └── lib2
│       └── libtest_2.a
└── src
    └── main.c

CMakeLists.txt 内容修改如下:

# CMake最低版本要求
cmake_minimum_required(VERSION 3.20)

# 项目名称
project(test_3)

# 添加头文件搜索目录(优雅的示范)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

# 指定生成目标
add_executable(test_3 main.c)

# 链接库文件(优雅的示范)
target_link_libraries(test_3 
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/lib1/libtest_1.a
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/lib2/libtest_2.a
)

四、为什么不使用link_directories

该命令指定构建工程时要搜索库的目录,然后在target_link_libraries中只指定引用的库名称。

不建议使用该命令指定库目录,因为如果不同模块有相同名称的库,编译时可能找不到正确的库。

官方也建议尽量不要使用该命令,而是使用 target_link_libraries 并传入库的绝对路径。

[CMake教程] 引用外部链接库_第1张图片

你可能感兴趣的:(CMake,cmake,链接库)