如何用cmake編譯

2022-09-15 02:48:12 字數 4505 閱讀 3502

本文由雲+社群發表

cmake是一種跨平台編譯工具,比make更為高階,使用起來要方便得多。cmake主要是編寫cmakelists.txt檔案,然後用cmake命令將cmakelists.txt檔案轉化為make所需要的makefile檔案,最後用make命令編譯原始碼生成可執行程式或共享庫(so(shared object))。因此cmake的編譯基本就兩個步驟:

cmake

make

g++ -rdynamic ../include/incl/tfc_base_config_file.cpp ../include/mq/*.cpp local_util.cpp agentmemrpt.cpp agentdiskrpt.cpp agentloadrpt.cpp agentiorpt.cpp agentnetrpt.cpp agentcpurpt.cpp agentprocessrpt.cpp agentparentrpt.cpp agentsystop_5.cpp basefeaturerptmain.cpp -o rpt_main -i../include/incl -i../include/mq -i../include/rapidjson -lpthread -ldl
一般把cmakelists.txt檔案放在工程目錄下,使用時,先建立乙個叫build的資料夾(這個並非必須,因為cmake命令指向cmakelists.txt所在的目錄,例如cmake .. 表示cmakelists.txt在當前目錄的上一級目錄。cmake後會生成很多編譯的中間檔案以及makefile檔案,所以一般建議新建乙個新的目錄,專門用來編譯),然後執行下列操作:

cd build 

cmake ..

make

其中cmake .. 在build裡生成makefile,make根據生成makefile檔案,編譯程式,make應當在有makefile的目錄下,根據makefile生成可執行檔案。

# 1. 宣告要求的cmake最低版本

cmake_minimum_required( version 2.8 )

# 2. 新增c++11標準支援

#set( cmake_cxx_flags "-std=c++11" )

# 3. 宣告乙個cmake工程

project(rpt_main)

message(status "project: server") #列印相關訊息訊息

# 4. 標頭檔案

include_directories(

$/../include/mq

$/../include/incl

$/../include/rapidjson

)# 5. 通過設定src變數,將源**路徑都給src,如果有多個,可以直接在後面繼續新增

set(src

$/../include/incl/tfc_base_config_file.cpp

$/../include/mq/tfc_ipc_sv.cpp

$/../include/mq/tfc_net_ipc_mq.cpp

$/../include/mq/tfc_net_open_mq.cpp

$/local_util.cpp

$/agentmemrpt.cpp

$/agentdiskrpt.cpp

$/agentloadrpt.cpp

$/agentiorpt.cpp

$/agentnetrpt.cpp

$/agentcpurpt.cpp

$/agentprocessrpt.cpp

$/agentparentrpt.cpp

$/agentsystop_5.cpp

$/basefeaturerptmain.cpp

)# 6. 建立共享庫/靜態庫

# 設定路徑(下面生成共享庫的路徑)

set(cmake_library_output_directory $/lib)

# 即生成的共享庫在工程資料夾下的lib資料夾中

set(lib_name rpt_main_lib)

# 建立共享庫(把工程內的cpp檔案都建立成共享庫檔案,方便通過標頭檔案來呼叫)

# 這時候只需要cpp,不需要有主函式

# $是生成的庫名 表示生成的共享庫檔案就叫做 lib工程名.so

# 也可以專門寫cmakelists來編譯乙個沒有主函式的程式來生成共享庫,供其它程式使用

# shared為生成動態庫,static為生成靜態庫

add_library($ static $)

# 7. 鏈結庫檔案

# 把剛剛生成的$庫和所需的其它庫鏈結起來

# 如果需要鏈結其他的動態庫,-l後接去除lib字首和.so字尾的名稱,以鏈結

# libpthread.so 為例,-lpthread

target_link_libraries($ pthread dl)

# 8. 編譯主函式,生成可執行檔案

# 先設定路徑

set(cmake_runtime_output_directory $/bin)

# 可執行檔案生成

add_executable($ $)

# 這個可執行檔案所需的庫(一般就是剛剛生成的工程的庫咯)

成功生成二進位制檔案

下次教大家如何用clion自動同步**到伺服器上,並進行debug

cmake交叉編譯

1 設定交叉編譯之前,必須在 cmakelist.txt 前面加上這樣一句,這樣 cmake 才會認為你是要交叉編譯 set cmake system namelinux 其中linux 是要編譯過去的平台,如果你是在 linux 下交叉編譯 window 的東西,就要寫成 windows 了。我是...

CMake編譯 雜記

一 cmake常見的預置的巨集 project name 通過project指定的專案名稱 project demo project source dir 工程的根目錄,上圖中的demo目錄 project binary dir 執行cmake命令的目錄,一般是在build目錄,在此目錄執行cmak...

cmake編譯報錯

問題 cmake編譯報錯 cmake error the source.此處大概意思是乙個檔案位址does not match the 另外乙個檔案位址so used to generate cache.rerun cmake.經過觀察可以發現兩個檔案位址其實只有一點差異,所以 第一次嘗試 按照第二...