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 指令,爲庫或可執行二進制文件指定庫鏈接