為什么要用cmake盅粪?makefile的語(yǔ)法非常復(fù)雜,光文檔就有200多頁(yè)悄蕾,使用起來(lái)不方便票顾,只支持linux平臺(tái),而cmake語(yǔ)法只有幾頁(yè)帆调,用法通俗易懂奠骄,上手簡(jiǎn)單,代碼量少番刊,跨平臺(tái)含鳞。這也是大多數(shù)人使用cmake的原因
cmake默認(rèn)使用CMakeLists.txt文件作為編寫腳本的文件,下面編寫了一個(gè)簡(jiǎn)單的CMakeLists.txt
#1.cmake verson芹务,指定cmake版本
cmake_minimum_required(VERSION 2.6)
#2.project name蝉绷,指定項(xiàng)目的名稱鸭廷,一般和項(xiàng)目的文件夾名稱對(duì)應(yīng)
PROJECT(main)
#包含的頭文件目錄
INCLUDE_DIRECTORIES(
include
)
#指定源文件目錄并賦值給DIR_SRCS變量
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
MESSAGE(STATUS "開始構(gòu)建")
#設(shè)置變量TEST_MATH
SET(TEST_MATH ${DIR_SRCS})
#將TEST_MATH變量值作為地址,將地址下的文件編譯成文件名為PROJECT_NAME變量值的可執(zhí)行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
cmake詳細(xì)介紹:
1.內(nèi)置變量
CMAKE_C_COMPILER:指定C編譯器+
CMAKE_C_FLAGS:編譯C文件時(shí)的選項(xiàng)熔吗,如-g辆床;也可以通過(guò)add_definitions添加編譯選項(xiàng)
EXECUTABLE_OUTPUT_PATH:可執(zhí)行文件的存放路徑
LIBRARY_OUTPUT_PATH:庫(kù)文件路徑
CMAKE_BUILD_TYPE::build 類型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug
BUILD_SHARED_LIBS:SHARED 表示生成動(dòng)態(tài)庫(kù)桅狠, STATIC表示生成靜態(tài)庫(kù)讼载。
2.方法
project (HELLO) #指定項(xiàng)目名稱,生成的VC項(xiàng)目的名稱中跌;
---- 使用${HELLO_SOURCE_DIR}表示項(xiàng)目根目錄
include_directories:指定頭文件的搜索路徑咨堤,相當(dāng)于指定gcc的-I參數(shù)
---- include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello為include目錄
link_directories:動(dòng)態(tài)鏈接庫(kù)或靜態(tài)鏈接庫(kù)的搜索路徑,相當(dāng)于gcc的-L參數(shù)
---- link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello為link目錄
add_subdirectory:包含子目錄
---- add_subdirectory (Hello)
add_executable:編譯可執(zhí)行程序漩符,指定編譯一喘,好像也可以添加.o文件
---- add_executable (helloDemo demo.cxx demo_b.cxx) #將cxx編譯成可執(zhí)行文件
add_definitions:添加編譯參數(shù)
---- add_definitions(-DDEBUG)將在gcc命令行添加DEBUG宏定義;
---- add_definitions( “-Wall -ansi –pedantic –g”)
target_link_libraries:添加鏈接庫(kù),相同于指定-l參數(shù)
---- target_link_libraries(demo Hello) #將可執(zhí)行文件與Hello連接成最終文件demo
add_library:
---- add_library(Hello hello.cxx) #將hello.cxx編譯成靜態(tài)庫(kù)如libHello.a
---- add_library(myTest SHARED IMPORTED) 將第三方庫(kù)作為動(dòng)態(tài)庫(kù)引用
---- set_target_properties(myTest PROPERTIES IMPORTED_LOCATION /libtest-lib.so)
add_custom_target:
message( status|fatal_error, “message”): 輸出信息
find_library(MY_LIB libmylib.a ./) 在指定目錄下搜索一個(gè)庫(kù), 保存在變量MY_LIB中
set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....
link_libraries( lib1 lib2 ...): All targets link with the same set of libs