add_library、target_link_libraries和link_directories的用法
一、add_library
用法:
該指令的主要作用就是將指定的源文件生成鏈接文件,然後添加到工程中去。該指令常用的語法如下:
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] [...])
其中表示庫文件的名字,該庫文件會根據命令裏列出的源文件來創建。而STATIC、SHARED和MODULE的作用是指定生成的庫文件的類型。STATIC庫是目標文件的歸檔文件,在鏈接其它目標的時候使用。SHARED庫會被動態鏈接(動態鏈接庫),在運行時會被加載。MODULE庫是一種不會被鏈接到其它目標中的插件,但是可能會在運行時使用dlopen-系列的函數。默認狀態下,庫文件將會在於源文件目錄樹的構建目錄樹的位置被創建,該命令也會在這裏被調用。
而語法中的source1 source2分別表示各個源文件。
例子:
二、link_directories
用法:
該指令的作用主要是指定要鏈接的庫文件的路徑,該指令有時候不一定需要。因爲find_package和find_library指令可以得到庫文件的絕對路徑。不過你自己寫的動態庫文件放在自己新建的目錄下時,可以用該指令指定該目錄的路徑以便工程能夠找到。
例子:
link_directories(
lib
)
三、target_link_libraries
用法:
該指令的作用爲將目標文件與庫文件進行鏈接。該指令的語法如下:
target_link_libraries(<target> [item1] [item2] [...]
[[debug|optimized|general] <item>] ...)
上述指令中的是指通過add_executable()和add_library()指令生成已經創建的目標文件。而[item]表示庫文件沒有後綴的名字。默認情況下,庫依賴項是傳遞的。當這個目標鏈接到另一個目標時,鏈接到這個目標的庫也會出現在另一個目標的連接線上。這個傳遞的接口存儲在interface_link_libraries的目標屬性中,可以通過設置該屬性直接重寫傳遞接口。
例子: