博客
关于我
CMakeLists之引入头文件(五)
阅读量:555 次
发布时间:2019-03-09

本文共 2845 字,大约阅读时间需要 9 分钟。

1、新建项目

新建项目t4,目录结构如下:

该程序引入了;main.c的内容如下所示:

//main.c#include 
int main(){ func(); return 0 ;}

2、导入第三方头文件

hello.h 位于/root/cpp_test/backup/cmake_test/t4/include/hello目录中,并没有位于系统标准的头文件路径,为了让我们的工程能够找到 hello.h 头文件,我们需要引入一个新的指令 INCLUDE_DIRECTORIES,其完整语法为:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的后面,你可以通过两种方式来进行控制搜索路径添加的方式:

现在我们在 src/CMakeLists.txt 中添加一个头文件搜索路径,方式很简单,加入:

INCLUDE_DIRECTORIES(/root/cpp_test/backup/cmake_test/t4/include/hello)

进入 build 目录,重新进行构建,这是找不到 hello.h 的错误已经消失,但是出现了一个新的错误:

main.c:(.text+0x12): undefined reference to `func' 因为我们并没有 link 到共享库 libhello 上。

3、为 target 添加共享库

我们现在需要完成的任务是将目标文件链接到 libhello,这里我们需要引入两个新的指令 LINK_DIRECTORIES 和 TARGET_LINK_LIBRARIES

LINK_DIRECTORIES 的全部语法是:

LINK_DIRECTORIES(directory1 directory2 ...)

这个指令非常简单,添加非标准的共享库搜索路径,比如,在工程内部同时存在共享库和可 执行二进制,在编译时就需要指定一下这些共享库的路径。这个例子中我们没有用到这个指令而是使用TARGET_LINK_LIBRARIES 。  TARGET_LINK_LIBRARIES 的全部语法是:

TARGET_LINK_LIBRARIES(target library1 
library2 ...)

这个指令可以用来为 target 添加需要链接的共享库,本例中是一个可执行文件,但是同样可以用于为自己编写的共享库添加共享库链接,libhello.so.1.2共享库的路径为/root/cpp_test/backup/cmake_test/t4/thirdPath/libhello.so.1.2。 为了解决我们前面遇到的 func 未定义错误,我们需要作的是向

src/CMakeLists.txt 中添加如下指令:

TARGET_LINK_LIBRARIES(main /root/cpp_test/backup/cmake_test/t4/thirdPath/libhello.so.1.2)

接下来进行编译:

mkdir buildcd buildcmake ..make

这是我们就得到了一个连接到 libhello 的可执行程序 main,位于 build/bin目录,运 行 main 的结果是输出:

bin/main#输出 hello world!

4、查看执行文链接库的情况

让我们来检查一下 main 的链接情况,输入命令:

ldd bin/main

得到的输出如下:

可以清楚的看到 main 确实链接了共享库 libhello,而且链接的是动态库 libhello.so.1

5、变更为链接到静态库 

将 TARGET_LINK_LIBRRARIES 指令修改为: 

TARGET_LINK_LIBRARIES(main /root/cpp_test/backup/cmake_test/t4/thirdPath/libhello.a)

重新构建后再来看一下 main 的链接情况 ldd src/main

说明,main 确实链接到了静态库 libhello.a

6、总结

通过(1-6)节的学习,我们几乎掌握了如下CMakeLists.txt指令的基本操作:

#命名项目PROJECT (HELLO)#添加生成可执行二进制文件ADD_EXECUTABLE(hello main.c)#在主CMakeLists.txt添加子执行文件ADD_SUBDIRECTORY(src bin)SET(LIBHELLO_SRC hello.c)#添加共享库ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})#添加静态库ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})#重命名静态库SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")#清除功能开启SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)#设置版本号SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)#安装文件及可执行文件INSTALL(TARGETS hello hello_static        LIBRARY DESTINATION thirdPath        ARCHIVE DESTINATION thirdPath)INSTALL(FILES hello.h DESTINATION include/hello)#导入第三方库头文件INCLUDE_DIRECTORIES(/root/cpp_test/backup/cmake_test/t4/include/hello)#导入第三方静态库TARGET_LINK_LIBRARIES(main /root/cpp_test/backup/cmake_test/t4/thirdPath/libhello.a)#导入第三方动态库TARGET_LINK_LIBRARIES(main /root/cpp_test/backup/cmake_test/t4/thirdPath/libhello.so.1.2)

到此为止,基本可以使用 cmake 工作了,但是还有很多高级的语法有待探讨。

转载地址:http://nfbpz.baihongyu.com/

你可能感兴趣的文章
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
查看>>
Mysql 中的日期时间字符串查询
查看>>
mysql 中索引的问题
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
MYSQL 主从同步文档的大坑
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>