參考:[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