1. 程式人生 > >Cmakelist: add_library、target_link_libraries和link_directories用法

Cmakelist: add_library、target_link_libraries和link_directories用法

cmake是Linux(這裡預設是Ubuntu系統)下常使用的編譯C++的工具,而使用cmake就需要先在CmakeLists.txt檔案中對編譯規則進行。這裡介紹常用的三種指令add_library、target_link_libraries和link_directories,該筆記主要參考了cmake官網給的教程,如有需要請訪問以下網址:

https://cmake.org/cmake/help/v3.1/

1. add_library

該指令的主要作用就是將指定的原始檔生成連結檔案,然後新增到工程中去。該指令常用的語法如下:

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2] [...])

其中<name>表示庫檔案的名字,該庫檔案會根據命令裡列出的原始檔來建立。而STATIC、SHARED和MODULE的作用是指定生成的庫檔案的型別。STATIC庫是目標檔案的歸檔檔案,在連結其它目標的時候使用。SHARED庫會被動態連結(動態連結庫),在執行時會被載入。MODULE庫是一種不會被連結到其它目標中的外掛,但是可能會在執行時使用dlopen-系列的函式。預設狀態下,庫檔案將會在於原始檔目錄樹的構建目錄樹的位置被建立,該命令也會在這裡被呼叫。

而語法中的source1 source2分別表示各個原始檔。

例子:

2. link_directories

該指令的作用主要是指定要連結的庫檔案的路徑,該指令有時候不一定需要

。因為find_package和find_library指令可以得到庫檔案的絕對路徑。不過你自己寫的動態庫檔案放在自己新建的目錄下時,可以用該指令指定該目錄的路徑以便工程能夠找到。

例子如下:


link_directories(
    self/define/lib/path
)

3. target_link_libraries

該指令的作用為將目標檔案與庫檔案進行連結。該指令的語法如下:

target_link_libraries(<target> [item1] [item2] [...]
                      [[debug|optimized|general] <item>] ...)

上述指令中的<target>是指通過add_executable()和add_library()指令生成已經建立的目標檔案。而[item]表示庫檔案沒有後綴的名字。預設情況下,庫依賴項是傳遞的。當這個目標連結到另一個目標時,連結到這個目標的庫也會出現在另一個目標的連線線上。這個傳遞的介面儲存在interface_link_libraries的目標屬性中,可以通過設定該屬性直接重寫傳遞介面。

例子如下: