cmake常用指令

CMake使用說明
Cmake常用的相對路徑的一些變量如下:

比如當前的程序工程結構如下:
頂層目錄 tcp_server
一層目錄 build/ CMakeList.txt src/
二層目錄 build/編譯目錄 src/CMakeList.txt src/*.cpp

編譯的方式: cd/build 然後cmake … make -j5

這個時候對應的變量具體路徑如下:
${PROJECT_SOURCE_DIR} 編譯所在的目錄 tcp_server
${CMAKE_BINARY_DIR} 所在目錄 tcp_server/build
${CMAKE_CURRENT_SOURCE_DIR} 是指當前CMakeList所在的路徑 tcp_server

常用的設置選項

以下設置主要是用戶交叉編譯,這樣設置很方便。

CMAKE_C_COMPILER:指定C編譯器
SET(CMAKE_C_COMPILER “ccache”)

CMAKE_CXX_COMPILER: 指定C++編譯器
SET(CMAKE_CXX_COMPILER “ccache”)

CMAKE_BUILD_TYPE 編譯類型 debug 或者release

CMAKE_CXX_FLAGS:設置 C++編譯選項
#release
set(CMAKE_BUILD_TYPE “Release”)
set(CMAKE_CXX_FLAGS “-O3 -Wall -std=c++0x”)
#debug
set(CMAKE_BUILD_TYPE “Debug”)
set(CMAKE_CXX_FLAGS “-g -O1 -Wall -std=c++0x”) -g表示gdb

add_subdirectory 添加子目錄, 通常頂層的CMakelist需要添加下一層的src
add_subdirectory(src)

支持條件判斷Cmake
IF(XXXX)
XXXX
ENDIF()

INCLUDE
用來載入CMakeLists.txt文件,也用於載入預定義的 cmake 模塊 *.cmake
include(${PROJECT_SOURCE_DIR}/…/…/build/libs-config.cmake)

cmake常用的一些方法
include_directories(路徑) 包含對應的路徑
link_directories(路徑) 需要鏈接一些庫,這些庫所在的目錄
ADD_EXECUTABLE(XXXX_EXE xx1.cpp xx2.cpp ) 生成對應的可執行程序
TARGET_LINK_LIBRARIES(XXXX_EXE xx.a xx2.a) 對應需要使用的庫

set_target_properties(XXXX_EXE PROPERTIES RUNTIME_OUTPUT_DIRECTORY “…”)
設置屬性,用來設置輸出的名稱,對於動態庫,還可以用來指定動態庫版本和 API 版本

cmake 在構建一個新的 target 時,會嘗試清理掉其他使用這個名字的庫,因爲,在構建 libhello.a 時,就會清理掉 libhello.so,下面的屬性設置解決此問題
set_target_properties(IoPortlib PROPERTIES CLEAN_DIRECT_OUTPUT 1)
但是如果你生成動態庫與靜態庫的名字不一致,就可以不用設置這個屬性。

把libhello_static.a 修改爲libhello.a
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME “hello”)

SET(LIBHELLO_SRC hello.c alg.c show.c)

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
libname不能重複,所以不能爲hello

可以同時得到 libhello.so/libhello.a 兩個庫

add_library(IoPort SHARED ${SRC_LIST}) 生成動態庫
add_library(IoPortlib STATIC ${SRC_LIST}) 生成靜態庫

EXECUTABLE_OUTPUT_PATH :重新定義最終執行程序的存放目錄
LIBRARY_OUTPUT_PATH:重新定義最終動態庫/靜態庫的存放目錄

如果是編譯第三方庫
include(ExternalProject) 加載ExternalProject
set(CONFIGURE_OPTS --enable-static=yes --enable-shared=no --disable-shared)、
設置configure參數
–enable-static:生成靜態鏈接庫
–enable-shared:生成動態鏈接庫
–disable-shared 禁止構建共享庫(默認啓用)

以安裝zookeeper爲例

ExternalProject_Add(
libzookeeper_proj #命名
URL ${LIB_DOWNLOAD_URL}/zookeeper-3.4.10.tar.gz #對應的安裝包路徑
CONFIGURE_COMMAND ./configure --prefix=<INSTALL_DIR> ${ENABLE_STATIC} #配置安裝目錄
TEST_BEFORE_INSTALL 0
BUILD_IN_SOURCE 1
INSTALL_DIR ${LIB_INSTALL_PREFIX}/zookeeper #安裝目錄
INSTALL_COMMAND make install #安裝命令
)

configure_file: 將一份文件拷貝到另一個位置並修改它的內容
configure_file ()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章