在程序中链接静态库 和 动态库

cpp 复制代码
9. 链接库
在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库
或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令
cpp 复制代码
heheda@linux:~/Linux/loveDBTeacher-v3$ tree
.
├── CMakeLists.txt
├── include
│   └── head.h
├── main.c
├── shareLib
│   └── libcalc.so
└── staticLib
    └── libcalc.a

3 directories, 5 files
heheda@linux:~/Linux/loveDBTeacher-v3$ 
  • mkdir shareLib
  • mkdir staticLib

把这篇文章 生成的libcalc.so放入shareLib、libcalc.a放入staticLib

一、在程序中链接静态库

cpp 复制代码
9.1 链接静态库
首先先指定静态库的路径
link_directories(<lib path>)
链接静态库
link_libraries(<static lib> [<static lib>...])
参数1:指定出要链接的静态库的名字
    可以是全名 libxxx.a
    也可以是掐头(lib)去尾(.a)之后的名字 xxx
参数2-N:要链接的其它静态库的名字

# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库, calc为静态库的名字
link_libraries(calc) 
  • CMakeLists.txt
cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/staticLib)
# 链接静态库, calc为静态库的名字
link_libraries(calc)

#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)

# 方式1: 使用aux_source_directory命令
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序

set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
  • CMakeLists.txt (也可以写成这样)
cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/staticLib)
# 链接静态库, calc为静态库的名字
link_libraries(calc)

#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)

# 方式2: 使用GLOB命令 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
# file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/*.c)
file(GLOB SRC_LIST ${CMAKE_CURRENT_LIST_DIR}/*.c)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序

set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
cpp 复制代码
执行命令:
1.mkdir build
2.cd build
3.cmake ..
4.make
5.cd ../bin
6./app
 
 
执行结果:
heheda@linux:~/Linux/loveDBTeacher-v3$ mkdir build
heheda@linux:~/Linux/loveDBTeacher-v3$ cd build
heheda@linux:~/Linux/loveDBTeacher-v3/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- 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
-- Detecting C compile features
-- Detecting C compile features - 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
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heheda/Linux/loveDBTeacher-v3/build
heheda@linux:~/Linux/loveDBTeacher-v3/build$ make
Scanning dependencies of target app
[ 50%] Building C object CMakeFiles/app.dir/main.c.o
[100%] Linking C executable ../bin/app
[100%] Built target app
heheda@linux:~/Linux/loveDBTeacher-v3/build$ cd ../bin
heheda@linux:~/Linux/loveDBTeacher-v3/bin$ ./app
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667
heheda@linux:~/Linux/loveDBTeacher-v3/bin$ 

二、在程序中链接动态库

cpp 复制代码
9.2 链接动态库
动态库的链接和静态库是完全不同的:
    - 静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,
      静态库就被加载到内存中了
    - 动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启
      动并且调用了动态库中的函数的时候,动态库才会被加载到内存

因此,在cmake中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后:
cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 添加并指定最终生成的可执行程序名
add_executable(app ${SRC_LIST})
# 指定可执行程序要链接的动态库名字
target_link_libraries(app pthread)
  • CMakeLists.txt
cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/shareLib)

#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)

# 方式1: 使用aux_source_directory命令
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
# 添加并指定最终生成的可执行程序名
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序

set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏

# 指定可执行程序要链接的动态库名字
target_link_libraries(app calc)
  • CMakeLists.txt (也可以写成这样)
cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/shareLib)

#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)

# 方式2: 使用GLOB命令 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
# file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/*.c)
file(GLOB SRC_LIST ${CMAKE_CURRENT_LIST_DIR}/*.c)
# 添加并指定最终生成的可执行程序名
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序

set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏

# 指定可执行程序要链接的动态库名字
target_link_libraries(app calc)

知识点:

cpp 复制代码
10. 预定义宏
         宏                                        功能
PROJECT_SOURCE_DIR                使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR                执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR          当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR          target编译目录
EXECUTABLE_OUTPUT_PATH            重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH               重新定义目标链接库文件的存放位置
PROJECT_NAME                      返回通过PROJECT指令定义的项目名称
CMAKE_BINARY_DIR                  项目实际构建路径,假设在build目录进行的构建,那么得到的就是
                                  这个目录的路径
相关推荐
阿部多瑞 ABU24 分钟前
`chenmo` —— 可编程元叙事引擎 V2.3+
linux·人工智能·python·ai写作
徐同保1 小时前
nginx转发,指向一个可以正常访问的网站
linux·服务器·nginx
HIT_Weston1 小时前
95、【Ubuntu】【Hugo】搭建私人博客:_default&partials
linux·运维·ubuntu
实心儿儿1 小时前
Linux —— 基础开发工具5
linux·运维·算法
oMcLin1 小时前
如何在SUSE Linux Enterprise Server 15 SP4上通过配置并优化ZFS存储池,提升文件存储与数据备份的效率?
java·linux·运维
王阿巴和王咕噜6 小时前
【WSL】安装并配置适用于Linux的Windows子系统(WSL)
linux·运维·windows
布史6 小时前
Tailscale虚拟私有网络指南
linux·网络
水天需0106 小时前
shift 命令详解
linux
wdfk_prog6 小时前
[Linux]学习笔记系列 -- 内核支持与数据
linux·笔记·学习
Xの哲學7 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法