如何使用外部共享库和头文件CMAKE PRACTICE第六章

接上一节自己创建库文件和头文件,这一节学习用别人的。


上一节的回顾:

①通过 ADD_LIBRARY 指令构建动态库(.so)和静态库(.a)。
②通过 SET_TARGET_PROPERTIES 同时构建同名的动态库和静态库。
③通过 SET_TARGET_PROPERTIES 控制动态库版本      SET_TARGET_PROPERTIES(动态库名 PROPERTIES VERSION x.x SOVERSION x)
④最终使用 INSTALL 指令来安装头文件和动态、静态库。  INSTALL(TARGETS xx  LIBRARY DESTINATION 地址xx   ARCHIVE DESTINATION 地址x)


接上节,libhello动态库已经被我们安装到本地了。

src中加入main.c ,调用hellofuc()函数,加入头文件 include"hello.h"

主要的修改动作在src中的CMakeLists里面,因为引入了一个新的头文件。 需要引入 INCLUDE_DIRECTORIES

一、引入头文件

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)添加 需要的头文件路径

#接上节,我们把hello.h放到了 /tmp/ts/urs/include/hello
INCLUDE_DIRECTORIES(/tmp/ts/urs/include/hello)

二、链接共享库

①LINK_DIRECTORIES(directory1 directory2 ...)添加需要链接的库文件目录

②TARGET_LINK_LIBRARIES(target library1<debug | optimized> library2...)设置要链接的库文件的名称

     这个指令可以用来为 target 添加需要链接的共享库,本例中是一个可执行文件,但是同样可以用于为自己编写的共享库添加共享库链接

TARGET_LINK_LIBRARIES(main libhello.so)

事实证明根据教程里的我没有弄懂,而且并不能实现功能,一直会显示没有链接到库。

我采用的是:

ADD_EXECUTABLE(main main.c)
INCLUDE_DIRECTORIES(/tmp/ts/usr/include/hello)
LINK_LIBRARIES(/tmp/ts/usr/lib)

可以找到头文件,但是一直链接不到库。

查阅网上的资料,发现了问题所在。首先我们找库要放在ADD前面,其次,我们最后要设置链接的库文件的名称。

INCLUDE_DIRECTORIES("/tmp/ts/usr/include/hello")
LINK_DIRECTORIES(/tmp/ts/usr/lib)
ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main libhello.so)

正确的写法 LINK要在ADD前面TARGET_LINK要在ADD后面。

再次编译,即可成功。

三、特殊的环境变量

CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH,是两个环境变量。

如果头文件没有存放在常规路径(/usr/include, /usr/local/include 等),则可以通过这些变量就行弥补。

上面采用的方式是输入了绝对路径  INCLUDE_DIRECTORIES 说明头文件的位置。如果想要更加智能,可以如下操作:

使用 bash 的方法
如下:
export CMAKE_INCLUDE_PATH=/tmp/ts/usr/include/hello
然后在头文件中将 INCLUDE_DIRECTORIES(/tmp/ts/usr/include/hello)替换为:
FIND_PATH(myHeader hello.h)
IF(myHeader)
INCLUDE_DIRECTORIES(${myHeader})
ENDIF(myHeader)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值