CMake知识:CMakeLists.txt动态链接库编译【4】

本文介绍如何使用CMake编译动态链接库,通过具体案例演示CMakeLists.txt的配置方法。主要内容包括基本设置、共享库的添加、目标别名定义及动态链接库的链接过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cmake-examples/01-basic/D-shared-library at master · ttroy50/cmake-examples · GitHub

一、说明

        如何用CMake编译动态链接库,重要的是CMakeLists.txt如何配置?本篇将就这个主题进行探索。用具体案例演示这个编译过程。

二、用案例进行说明

2.1 CMakeLists.txt的基本设置

include_directories(${CMAKE_SOURCE_DIR}/inc)
link_directories(${CMAKE_SOURCE_DIR}/lib)

add_executable(foo ${FOO_SRCS})
target_link_libraries(foo bar) # libbar.so is found in ${CMAKE_SOURCE_DIR}/lib

2.2 案例和实现

本例显示了一个 hello world 示例,该示例首先创建并链接了一个共享库。

这还显示了如何创建别名目标

本教程中的文件如下:

$ tree
.
├── CMakeLists.txt
├── include
│   └── shared
│       └── Hello.h
└── src
    ├── Hello.cpp
    └── main.cpp

三、如何添加共享库

与前面关于静态库的示例一样,add_library() 函数也用于从一些源文件创建共享库。这被称为如下:

add_library(hello_library SHARED
    src/Hello.cpp
)

这将用于创建一个名为 libhello_library.so 的共享库,并将源传递给 add_library() 函数。

四、目标别名 Target

顾名思义,别名目标是目标的替代名称,可以在只读上下文中代替真实目标名称。
add_library(hello::library ALIAS hello_library)

如下所示,这允许您在将目标链接到其他目标时使用别名来引用目标。

五、连接动态链接库-Linking a Shared Library

链接共享库与链接静态库相同。创建可执行文件时,使用 target_link_library() 函数指向您的库

add_executable(hello_binary
    src/main.cpp
)

target_link_libraries(hello_binary
    PRIVATE
        hello::library
)

这告诉 CMake 使用别名目标名称将 hello_library 与 hello_binary 可执行文件链接起来。

链接器调用的一个例子是

/usr/bin/c++ CMakeFiles/hello_binary.dir/src/main.cpp.o -o hello_binary -rdynamic libhello_library.so -Wl,-rpath,/home/matrim/workspace/cmake-examples/01-basic/D-shared-library/build

六、编译工程

$ mkdir build

$ cd build

$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/matrim/workspace/cmake-examples/01-basic/D-shared-library/build

$ make
Scanning dependencies of target hello_library
[ 50%] Building CXX object CMakeFiles/hello_library.dir/src/Hello.cpp.o
Linking CXX shared library libhello_library.so
[ 50%] Built target hello_library
Scanning dependencies of target hello_binary
[100%] Building CXX object CMakeFiles/hello_binary.dir/src/main.cpp.o
Linking CXX executable hello_binary
[100%] Built target hello_binary

$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  hello_binary  libhello_library.so  Makefile

$ ./hello_binary
Hello Shared Library!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无水先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值