接上一节自己创建库文件和头文件,这一节学习用别人的。
上一节的回顾:
①通过 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)