04 使用外部共享库和头文件
任务目标
- 编写一个程序,使用 静态库与动态库构建 构建的共享库 libhello.so
一、准备工作
① 进入 /home/lql/cmake 目录
cd /home/lql/cmake
新建并进入 t4 工作目录
mkdir t4 && cd t4
② 新建 src 目录(用于存放源文件 main.c 和 src 目录相应的 CMakeLists.txt)
mkdir main && cd main
新建源文件 main.c
vim main.c
输入内容:
#include <hello.h>
int main()
{
HelloFunc();
return 0;
}
新建 CMakeLists.txt
vim CMakeLists.txt
输入内容:
ADD_EXECUTABLE(main main.c)
③ 在工程主目录下新建 CMakeLists.txt
vim CMakeLists.txt
输入内容:
PROJECT(NEWHELLO)
ADD_SUBDIRECTORY(src)
二、外部构建
① 新建并进入 build 目录
mkdir build && cd build
② 构建
cmake ..
make
cmake 时报错
main.c:1:10: fatal error: hello.h: 没有那个文件或目录
#include <hello.h>
解决方法:引入头文件
使用 INCLUDE_DIRECTORIES 指令,指定头文件路径
修改 src/CMakeLists.txt
ADD_EXECUTABLE(main main.c)
# 添加如下内容
INCLUDE_DIRECTORIES(/home/lql/cmake/to/include/hello) // 添加构建的头文件 hello.h 的路径 /home/lql/cmake/to/include/hello
进入 build 目录,再次构建
cd build
cmake ..
make
make 时报错
main.c:(.text+0xa):对‘HelloFunc’未定义的引用
解决方法:添加共享库
使用 LINK_DIRECTORIES 和 TARGET_LINK_LIBRARIES 指令,将目标文件链接到 libhello
修改 src/CMakeLists.txt
ADD_EXECUTABLE(main main.c)
INCLUDE_DIRECTORIES(/home/lql/cmake/to/include/hello)
# 添加如下内容
LINK_DIRECTORIES(/home/lql/cmake/to/lib)
TARGET_LINK_LIBRARIES(main hello)
进入 build 目录,再次构建
cd build
cmake ..
make
make 时报错
/usr/bin/ld: 找不到 -lhello
解决方法:奇了个怪,换个位置
修改 src/CMakeLists.txt
# 1. 先指定要链接的第三方头文件和库文件路径
INCLUDE_DIRECTORIES(/home/lql/cmake/to/include/hello) // 头文件路径
LINK_DIRECTORIES(/home/lql/cmake/to/lib) // 库文件路径
# 2. 再指定可执行二进制文件及其库链接
ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main hello) // 库链接
o**k,终于没错了
三、运行可执行程序 main
可执行程序 main,在 build/src,为什么?是由于主工程下的 CMakeLists.txt 中 ADD_SUBDIRECTORY 用于指定的中间二进制文件和目标二进制文件存放目录为 src,又因为在 build 目录进行外部构建,所以最终生成的可执行程序目录为 build/src
小结
- INCLUDE_DIRECTORIES 指令,指定第三方头文件搜索路径
- LINK_DIRECTORIES 指令,指定第三方库文件搜索路径
- TARGET_LINK_LIBRARIES 指令,为库或可执行二进制文件指定库链接