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 指令,爲庫或可執行二進制文件指定庫鏈接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章