代码在git
既然我们已经生成了库,那么就进行链接测试下。重新建一个工程目录,然后把上节生成的库拷贝过来,然后在在工程目录下新建src目录和bin目录,在src目录下添加一个main.c,整体结构如下,

.
├── bin
├── build
├── CMakeLists.txt
├── src
│   └── main.c
└── testFunc├── inc│   └── testFunc.h└── lib├── libtestFunc.a└── libtestFunc.so

main.c内容如下,

#include <stdio.h>#include "testFunc.h"int main(void)
{func(100);return 0;
}

工程目录下的CMakeLists.txt内容如下,

cmake_minimum_required (VERSION 3.5)project (demo)set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)set (SRC_LIST ${PROJECT_SOURCE_DIR}/src/main.c)# find testFunc.h
include_directories (${PROJECT_SOURCE_DIR}/testFunc/inc)find_library(TESTFUNC_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)add_executable (main ${SRC_LIST})target_link_libraries (main ${TESTFUNC_LIB})

这里出现2个新的命令,

  • find_library: 在指定目录下查找指定库,并把库的绝对路径存放到变量里,其第一个参数是变量名称,第二个参数是库名称,第三个参数是HINTS,第4个参数是路径,其它用法可以参考cmake文档
  • target_link_libraries: 把目标文件与库文件进行链接
    使用find_library的好处是在执行cmake …时就会去查找库是否存在,这样可以提前发现错误,不用等到链接时。

cd到build目录下,然后运行cmake … && make,最后进入到bin目录下查看,发现main已经生成,运行之,

运行成功!

ps:在lib目录下有testFunc的静态库和动态库,find_library(TESTFUNC_LIB testFunc …默认是查找动态库,如果想直接指定使用动态库还是静态库,可以写成find_library(TESTFUNC_LIB libtestFunc.so …或者find_library(TESTFUNC_LIB libtestFunc.a …

ps: 查看elf文件使用了哪些库,可以使用readelf -d ./xx来查看

之前本节教程使用的是库查找方法是link_directories,但是很多读者反映运行时有问题,本人去官方文档上查了下,发现不建议使用了,推荐使用find_library或者find_package

Linux下CMake简明教程(七)对库进行链接相关推荐

  1. Linux下CMake简明教程(六)动态库和静态库的编译控制

    代码在git 有时只需要编译出动态库和静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake.首先按照如下重新组织文件,只留下testFunc.h和TestFunc.c ├── CM ...

  2. Linux下CMake简明教程(二)同一目录下多个源文件

    代码在git 接下来进入稍微复杂的例子:在同一个目录下有多个源文件.在之前的目录下添加2个文件,testFunc.c和testFunc.h.添加完后整体文件结构如下, (base) ledi@ledi ...

  3. Linux下CMake简明教程(一)简单入门

    代码链接 CMake是开源.跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件 ...

  4. Linux下CMake简明教程(九) 添加控制选项

    代码在git 有时希望在编译代码时只编译一些指定的源码,可以使用cmake的option命令,主要遇到的情况分为2种: 本来要生成多个bin或库文件,现在只想生成部分指定的bin或库文件 对于同一个b ...

  5. Linux下CMake简明教程(10) 定义宏来控制打印的信息

    代码在git 假设我们有个main.c,其内容如下 #include <stdio.h>int main(void) {#ifdef WWW1printf("hello worl ...

  6. Linux下CMake简明教程(八) 添加编译选项

    代码在git 有时编译程序时想添加一些编译选项,如-Wall,-std=c++11等,就可以使用add_compile_options来进行操作. 这里以一个简单程序来做演示,main.cpp如下 # ...

  7. Linux下CMake简明教程(五)正规一点的组织结构

    代码在git 正规一点来说,一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,最终输出的elf文件会放到bin目录下,这样整个结构更加清晰.让我 ...

  8. Linux下CMake简明教程(四)不同目录下多个源文件

    代码在git 一般来说,当程序文件比较多时,我们会进行分类管理,把代码根据功能放在不同的目录下,这样方便查找.那么这种情况下如何编写CMakeLists.txt呢? 我们把之前的源文件整理一下(新建2 ...

  9. Linux下CMake简明教程(三)同一目录下多个源文件

    如果在同一目录下有多个源文件,那么只要在add_executable里把所有源文件都添加进去就可以了.但是如果有一百个源文件,再这样做就有点坑了,无法体现cmake的优越性,cmake提供了一个命令可 ...

最新文章

  1. 5. 编程规范和编程安全指南--JavaScript
  2. Oracle视图添加约束,Oracle的约束视图
  3. SQL Server 2005的服务器角色(public)的问题
  4. scratch跳一跳游戏脚本_涂鸦骑士3D版强势屠榜,腾讯跳一跳“宝刀未老” | 休闲新游周报...
  5. c语言程序运行结果怎么看,帮忙看看我这个C语言程序有什么错误,运行结果不正确...
  6. mysql查询1971年以前_mysql查询昨天 一周前 一月前 一年前的数据
  7. limit where group by having select
  8. Atitit 数据库view视图使用推荐规范与最佳实践与方法
  9. 乌鲁木齐市谷歌高清卫星地图下载
  10. 禅道、码云、coding、redmine、jira、teambition几大敏捷开发项目管理系统试用对比体验
  11. co作为前缀的意思_注定孤独的前缀|英汉比较教学法·语音思维No.17
  12. 6款沙发背景墙装饰画 总有一幅你喜欢的
  13. 使用Markdown如何修改图片大小
  14. 云虚拟主机worldpress安装教程
  15. 数据分析必看的oCPM/oCPC核心知识点
  16. steam进社区显示服务器错误,Steam错误代码-118怎么办 社区打不开解决方法
  17. MyBatis-plus分页查询整理
  18. 论坛介绍 | COSCon'22 物联网(IoT)
  19. 常见系统问题及其解决方法
  20. 资源采集网php源码,ThinkPHP5.1 自动采集资源网 源码开源

热门文章

  1. 基于深度学习的步态识别算法的MATLAB仿真
  2. 五、linux总线中设备和驱动注册流程详解
  3. python之人脸识别
  4. 五天带你学完《计算机网络》·第一天·物理层
  5. 一本比较简单易懂的中文python入门教程
  6. 思科推出EnergyWise合作伙伴计划
  7. RAID重组和数据库数据的修复与验证
  8. backbone.js全栈开发
  9. 连载《一个程序猿的生命周期》- 32、两个企业急着上项目,紧急赶赴现场了解情况...
  10. Dos命令删除注册表项