CMake:04 使用外部共享库和头文件

任务目标

一、准备工作

① 进入 /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,终于没错了
外部构建 t4

三、运行可执行程序 main

可执行程序 main,在 build/src,为什么?是由于主工程下的 CMakeLists.txt 中 ADD_SUBDIRECTORY 用于指定的中间二进制文件和目标二进制文件存放目录为 src,又因为在 build 目录进行外部构建,所以最终生成的可执行程序目录为 build/src

运行可执行程序 main

小结

  • INCLUDE_DIRECTORIES 指令,指定第三方头文件搜索路径
  • LINK_DIRECTORIES 指令,指定第三方库文件搜索路径
  • TARGET_LINK_LIBRARIES 指令,为库或可执行二进制文件指定库链接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值