CMakeLists之引入標頭檔案 五

2021-10-19 05:04:59 字數 3521 閱讀 8666

新建專案t4,目錄結構如下:

該程式引入了自建的hello.h程式庫包含了函式func();main.c的內容如下所示:

#include int main()

hello.h 位於/root/cpp_test/backup/cmake_test/t4/include/hello目錄中,並沒有位於系統標準的標頭檔案路徑,為了讓我們的工程能夠找到 hello.h 標頭檔案,我們需要引入乙個新的指令 include_directories,其完整語法為:

include_directories([after|before] [system] dir1 dir2 ...)
這條指令可以用來向工程新增多個特定的標頭檔案搜尋路徑,路徑之間用空格分割,如果路徑中包含了空格,可以使用雙引號將它括起來,預設的行為是追加到當前的標頭檔案搜尋路徑的後面,你可以通過兩種方式來進行控制搜尋路徑新增的方式:

現在我們在 src/cmakelists.txt 中新增乙個標頭檔案搜尋路徑,方式很簡單,加入:

include_directories(/root/cpp_test/backup/cmake_test/t4/include/hello)
進入 build 目錄,重新進行構建,這是找不到 hello.h 的錯誤已經消失,但是出現了乙個新的錯誤:

main.c:(.text+0x12): undefined reference to `func' 因為我們並沒有 link 到共享庫 libhello 上。

我們現在需要完成的任務是將目標檔案鏈結到 libhello,這裡我們需要引入兩個新的指令 link_directories 和 target_link_libraries

link_directories 的全部語法是:

link_directories(directory1 directory2 ...)
這個指令非常簡單,新增非標準的共享庫搜尋路徑,比如,在工程內部同時存在共享庫和可 執行二進位制,在編譯時就需要指定一下這些共享庫的路徑。這個例子中我們沒有用到這個指令而是使用target_link_libraries 。  target_link_libraries 的全部語法是:

target_link_libraries(target library1 library2 ...)
這個指令可以用來為 target 新增需要鏈結的共享庫,本例中是乙個可執行檔案,但是同樣可以用於為自己編寫的共享庫新增共享庫鏈結,libhello.so.1.2共享庫的路徑為/root/cpp_test/backup/cmake_test/t4/thirdpath/libhello.so.1.2。 為了解決我們前面遇到的 func 未定義錯誤,我們需要作的是向

src/cmakelists.txt 中新增如下指令:

target_link_libraries(main /root/cpp_test/backup/cmake_test/t4/thirdpath/libhello.so.1.2)
接下來進行編譯:

mkdir build

cd build

cmake ..

make

這是我們就得到了乙個連線到 libhello 的可執行程式 main,位於 build/bin目錄,運 行 main 的結果是輸出:

bin/main

#輸出 hello world!

ldd bin/main
得到的輸出如下:

將 target_link_librraries 指令修改為: 

target_link_libraries(main /root/cpp_test/backup/cmake_test/t4/thirdpath/libhello.a)
重新構建後再來看一下 main 的鏈結情況 ldd src/main

說明,main 確實鏈結到了靜態庫 libhello.a

通過(1-6)節的學習,我們幾乎掌握了如下cmakelists.txt指令的基本操作:

#命名專案

project (hello)

#新增生成可執行二進位制檔案

add_executable(hello main.c)

#在主cmakelists.txt新增子執行檔案

add_subdirectory(src bin)

set(libhello_src hello.c)

#新增共享庫

add_library(hello shared $)

#新增靜態庫

add_library(hello_static static $)

#重新命名靜態庫

set_target_properties(hello_static properties output_name "hello")

#清除功能開啟

set_target_properties(hello properties clean_direct_output 1)

set_target_properties(hello_static properties clean_direct_output 1)

#設定版本號

set_target_properties(hello properties version 1.2 soversion 1)

#安裝檔案及可執行檔案

install(targets hello hello_static

library destination thirdpath

archive destination thirdpath)

install(files hello.h destination include/hello)

#匯入第三方庫標頭檔案

include_directories(/root/cpp_test/backup/cmake_test/t4/include/hello)

#匯入第三方靜態庫

target_link_libraries(main /root/cpp_test/backup/cmake_test/t4/thirdpath/libhello.a)

#匯入第三方動態庫

target_link_libraries(main /root/cpp_test/backup/cmake_test/t4/thirdpath/libhello.so.1.2)

到此為止,基本可以使用 cmake 工作了,但是還有很多高階的語法有待**。

Ceres學習筆記之CMakeLists寫法總結

高博說 不要長期徘徊在自己的舒適區里猶豫不決,這樣是沒有進步的。這句話開啟了我的slam後端優化學習之路。本文從cmakelists開始,總結常用的各個庫在cmakelists中的寫法。眾人 哇!又是這麼小兒科的嗎?博主 哎呀 不要這樣講嘛 qwq我會一直努力的 通常的cmakelists結構是 c...

(44)常量 (45)檔案引入

44 常量 常量 不能重新宣告 不能修改 不能銷毀 define pi 3.14 定義常量 檢測長量是否存在 if defined pi false else 動態常量名 constant 函式給引數返回敞亮值 yzl pi echo constant yzl 45 檔案引入 include inc...

python之模組引入

python之模組引入 1 模組和包 1 模組 乙個py檔案 內建模組和第三方模組 內建模組是python自帶的,而第三方模組是自定義的模組或者匯入的第三方庫 2 包 包含 init py檔案的資料夾 2 模組的匯入 1 import 模組 內建模組的匯入,只匯入到模組,呼叫函式 模組.函式 2 i...