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

这篇具有很好参考价值的文章主要介绍了在程序中链接静态库 和 动态库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

9. 链接库
在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库
或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令
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

一、在程序中链接静态库 

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
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  (也可以写成这样) 
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宏
执行命令:
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$ 

二、在程序中链接动态库

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
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  (也可以写成这样) 
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)

在程序中链接静态库 和 动态库,CMake 笔记,linux,Cmake知识点:文章来源地址https://www.toymoban.com/news/detail-796393.html

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目录进行的构建,那么得到的就是
                                  这个目录的路径

到了这里,关于在程序中链接静态库 和 动态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CMake 指定链接选项

    CMake指定目标的链接选项,有三种方案 方案一 通过target_link_options来设置,(version 3.13.以上) 方案二 通过目标的属性来设置 或者 方案三 set(LINK_FLAGS) 参考: CMake教程系列-04-编译相关函数 - 知乎 CMake 指定目标的链接选项_icbm的博客-CSDN博客_cmake添加链接选项 Gcc链接选项_jian

    2024年02月14日
    浏览(43)
  • 使用CMake交叉编译Arm Linux程序

    注意,工具链文件的指定一定要紧跟cmake命令之后,不能放到 … 后面构建arm架构cmake 工程里新建一个文件叫arm_linux_setup.cmake arm_linux_setup.cmake内容如下

    2024年02月03日
    浏览(57)
  • Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接)

    gcc是对c语言代码进行编译链接,而g++是对c++代码进行编译链接,接下来我们只对gcc进行讲解,g++的使用方法跟gcc是一样的。 编译链接的四个步骤: 1:预处理 2:编译 3:汇编 4:链接 注:这些在后面都会着重讲解 我们先在Date.c 源文件里面写一些c语言代码,我们知道,c语言代码需

    2024年02月05日
    浏览(52)
  • 现代CMake高级教程 - 第 3 章:链接库文件

    双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记 main.cpp 调用 mylib.cpp 里的 say_hello 函数 1. 直接链接到一起编译 2. mylib 作为一个静态库 编译: 生成了 libmylib.a: 3. mylib 作为一个动态库 编译: 4. mylib 作为一个对象库 对象库类似于静态库,但不生成 .a 文件,只由 CMake

    2024年02月02日
    浏览(42)
  • CMake 链接时出现undefined reference to 错误

    一、问题背景 之前新建了一个项目项目文件分布为 1. src/MROR.cpp 2.include/MROR.h 3.main.cpp 执行cmake出现undefined reference toxx,显示main函数中的类成员函数调用没有声明,但是所有声明已经在MROR.h中写了 二、解决方法 我查了很多网上资料 解决方法 1) 可能MROR.cpp文件没有链接到项目,

    2024年02月09日
    浏览(60)
  • 在程序中链接静态库 和 动态库

    mkdir shareLib mkdir staticLib 把这篇文章  生成的libcalc.so放入shareLib、libcalc.a放入staticLib 一、在程序中链接静态库  CMakeLists.txt CMakeLists.txt   (也可以写成这样)  二、在程序中链接动态库 CMakeLists.txt CMakeLists.txt   (也可以写成这样)  知识点:

    2024年01月17日
    浏览(54)
  • 现代CMake高级教程 - 第 5 章:链接第三方库

    双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记 案例 使用 tbb 库 main.cpp 直接链接 tbb CMakeLists.txt 直接链接 tbb 的缺点: 如果这样直接指定 tbb,CMake 会让链接器在系统的库目录里查找 tbb,他会找到 /usr/lib/libtbb.so 这个系统自带的,但这对于没有一个固定库安装位置的

    2024年02月02日
    浏览(56)
  • 【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月14日
    浏览(48)
  • linux下g++链接动态库和静态库

    头文件的作用: include的作用就是复制内容到当前文件 井号开头的就是预处理指令,由预处理器处理,预处理阶段不关心代码,只处理预处理指令。 头文件主要 一是为了解决代码都写在一个文件太大了,二是把变量,结构体,函数声明这些固定的放在一起 函数只要声明了,

    2024年02月09日
    浏览(52)
  • Visual Studio连接Linux服务器编译CMake项目,生成在Linux上运行的程序

    window系统:Windows 10 企业版 64位操作系统 Linux系统:BigCloud Enterprise Linux 7.8 (Core) Visual Studio:Microsoft Visual Studio Enterprise 2019 版本 16.10.4 根据Microsoft官网文档介绍, 开始之前 首先,请确保已安装 Visual Studio Linux 工作负载,包括 CMake 组件。 它属于 Visual Studio 安装程序中的“使用

    2024年02月13日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包