CMake構建靜態庫和動態庫

參考:[CLion中使用CMake導入第三方庫的方法](https://blog.csdn.net/asdfsadfasdfsa/article/details/87343136 CMake)

1、使用sqlite3源碼同時編譯動態庫和靜態庫


# 設定編譯宏
add_definitions(-DSQLITE3_EXPORTS -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_RTREE)
add_definitions('-arch arm64')

#設置MAPZONE SDK主目錄變量
#生成靜態庫和動態庫的存放地址
set(MAPZONE_SDK_CORE ../../../)

#區分不同的平臺
if (APPLE)
    set(LIBRARY_OUTPUT_PATH ${MAPZONE_SDK_CORE}/bin/mac/mzcorelib/)
elseif(UNIX)
    set(LIBRARY_OUTPUT_PATH ${MAPZONE_SDK_CORE}/bin/linux/mzcorelib/)
endif ()

#設置頭文件引用目錄位置
include_directories(${MAPZONE_SDK_CORE}/include)

#設置連接庫引用目錄位置
link_directories(${LIBRARY_OUTPUT_PATH})

#設置編譯源碼
set(SOURCE_FILES sqlite3.c)

#設置編譯成果
add_library(mzsqlite_shared SHARED ${SOURCE_FILES})
add_library(mzsqlite_static STATIC ${SOURCE_FILES})

#重置編譯成果名稱
set_target_properties(mzsqlite_shared PROPERTIES OUTPUT_NAME "mzsqlite")
set_target_properties(mzsqlite_static PROPERTIES OUTPUT_NAME "mzsqlite")

2、一般項目的CMake文件配置

set(LINK_DIR /usr/lib2/libnet-1.2-rc3/src/.libs)
set(LINK_DIR2 /usr/lib2/libpcap-1.0.0)
set(PRO simple_network_sniffer)
#1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.2)
 
#2.project name,指定項目的名稱,一般和項目的文件夾名稱對應
PROJECT(${PRO})
 
 
 
#3.head file path,頭文件目錄
INCLUDE_DIRECTORIES(
        include
)
# 設置庫文件的尋找目錄
link_directories(${LINK_DIR}
        ${LINK_DIR2})

# 需要鏈接的庫
link_libraries(net pcap)
 
#4.source directory,源文件目錄 
#將src目錄中的所有源文件 給變量 DIR_SRCS
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
 
#5.set environment variable,設置環境變量,編譯用到的源文件全部都要放到這里,否則編譯能夠通過,但是執行的時候會出現各種問題,比如"symbol lookup error xxxxx , undefined symbol"
#SET(TEST_MATH ${DIR_SRCS})
 
#6.add executable file,添加要編譯的可執行文件
ADD_EXECUTABLE(${PRO} ${DIR_SRCS})
 
#7.add link library,添加可執行文件所需要的庫,比如我們用到了libm.so(命名規則:lib+name+.so),就添加該庫的名稱
TARGET_LINK_LIBRARIES(${PRO} net pcap)

3、Cmake內部變量

CMAKE_C_COMPILER:指定C編譯器

CMAKE_CXX_COMPILER:

CMAKE_C_FLAGS:編譯C文件時的選項,如-g;也可以通過add_definitions添加編譯選項

EXECUTABLE_OUTPUT_PATH:可執行文件的存放路徑

LIBRARY_OUTPUT_PATH:庫文件路徑

CMAKE_BUILD_TYPE::build 類型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

內置變量的使用:

>> 在CMakeLists.txt中指定,使用set

>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

4、CMake命令說明

project (HELLO) 指定項目名稱,生成的VC項目的名稱;

使用${HELLO_SOURCE_DIR}表示項目根目錄

include_directories:指定頭文件的搜索路徑,相當于指定gcc的-I參數

include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello為include目錄

link_directories:動態鏈接庫或靜態鏈接庫的搜索路徑,相當于gcc的-L參數

   >> link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello為link目錄

add_subdirectory:包含子目錄

   >> add_subdirectory (Hello)

add_executable:編譯可執行程序,指定編譯,好像也可以添加.o文件

   >> add_executable (helloDemo demo.cxx demo_b.cxx)   #將cxx編譯成可執行文件——

add_definitions:添加編譯參數

add_definitions(-DDEBUG)將在gcc命令行添加DEBUG宏定義;

add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加鏈接庫,相同于指定-l參數

target_link_libraries(demo Hello) #將可執行文件與Hello連接成最終文件demo

add_library: 生成動態庫或者靜態庫

add_library(Hello hello.cxx) #將hello.cxx編譯成靜態庫如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....

link_libraries( lib1 lib2 ...): All targets link with the same set of libs

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容

  • 1.安裝 $sudo apt-get install cmake 2.示例:簡單的文件目錄 sample |—...
    荷包蛋醬閱讀 29,683評論 0 15
  • 向您的項目添加 C 和 C++ 代碼 本文內容 下載 NDK 和構建工具 創建支持 C/C++ 的新項目 構建和運...
    會飛的大象_閱讀 3,816評論 0 3
  • 0 綜述 我覺的Cmake比較核心的一些東西就是 怎么去組織一個項目的編譯框架 最終輸出目標有哪些(可執行程序,動...
    趙國開閱讀 26,020評論 2 35
  • Cmake 入門 前言 CMake是一個比make更高級的編譯配置工具,它可以根據不同平臺、不同的編譯器,生成相應...
    渝潼不肖生閱讀 2,113評論 1 5
  • CMake學習 本篇分享一下有關CMake的一些學習心得以及相關使用。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,274評論 11 79