本文主要介紹如何將乙個依賴 makefile 專案(midg)移植到 cmake 上。
首先介紹專案檔案結構,檔案主要由三個目錄組成
3rdparty
include
src其中,3rdparty
中包含兩個外部函式庫,即metis
與parmetis
,生成兩個靜態鏈結庫libmetis.a
與libparmetis.a
。src
包含專案所有源程式,include
則包含了全部標頭檔案。
因此,我們在根目錄下 cmake 配置檔案內容如下
cmake_minimum_required(version 3.1)
project(dgom)
set(cmake_c_flags "$")
set(cmake_c_compiler /usr/local/bin/mpicc)
set(cmake_cxx_compiler /usr/local/bin/mpicxx)
# 3rdparty library
# build with original makefile
set(metis_library $/lib/libmetis.a)
set(parmetis_library $/lib/libparmetis.a)
add_custom_target(build_metis all
command $
working_directory $/3rdparty/parmetis-3.1/metislib/
comment "original metis makefile target")
add_custom_target(build_parmetis all
command $
working_directory $/3rdparty/parmetis-3.1/parmetislib/
comment "original parmetis makefile target")
add_library(metis static imported)
add_library(parmetis static imported)
set_target_properties(metis properties imported_location_noconfig "$")
set_target_properties(parmetis properties imported_location_noconfig "$")
add_dependencies(metis build_metis)
add_dependencies(parmetis build_parmetis)
# source file
add_subdirectory(src)
set(cmake_c_compiler mpicc)
,set(cmake_cxx_compiler mpicxx)
負責選擇專案編譯器,本專案中選擇mpich2
metis
parmetis
第三方庫採用原始 makefile 編譯,將編譯好的靜態庫檔案新增到專案中
3rdparty
目錄如下
./
└── parmetis-3.1
├── metislib
├── manual
└── parmetislib
metislib
與parmetislib
分別為兩個不同的網格劃分庫。原始make命令分別進入兩個專案所在目錄使用make
命令即可。因此,在主目錄cmakelists.txt
中呼叫make
命令編譯庫函式,主要步驟如下:
add_custom_target(build_metis all
command $
working_directory $/3rdparty/parmetis-3.1/metislib/
comment "original metis makefile target")
add_custom_target(build_parmetis all
command $
working_directory $/3rdparty/parmetis-3.1/parmetislib/
comment "original parmetis makefile target")
add_custom_target
通過使用者給定的指令來增加乙個新的編譯目標。all
代表該目標新增到預設編譯目標中,因此每次編譯都會執行。
這兩個目標為外部庫imported
,而非專案自己編譯的
add_library(metis static imported)
add_library(parmetis static imported)
set_target_properties(metis properties imported_location_noconfig "$")
set_target_properties(parmetis properties imported_location_noconfig "$")
確保首先執行編譯過程
add_dependencies(metis build_metis)
add_dependencies(parmetis build_parmetis)
原始檔編譯時候需要標頭檔案路徑,並且與第三方庫進行鏈結
set(src_list
mesh2d.c utils.c loadbalance2d.c facepair2d.c
parallelpairs.c buildmaps2d.c startup2d.c
maxwellsrun2d.c maxwellsmpi2d.c maxwellsdriver2d.c
maxwellsrhs2d.c initcpu2d.c)
add_executable(dgom2 $)
include_directories("../include")
target_link_libraries(dgom2 metis parmetis)
add_executable(dgom2 $)
include_directories("../include")
target_link_libraries(dgom2 metis parmetis)
cmake構建qt工程
如何選擇?using cmake to build qt projects 一文中說 儘管如此,如果簡單qt的工程都不知道怎麼用 cmake 構建,複雜的工程,就更不知道如何使用 cmake 了。還是從簡單的學起吧 include include qdebug int main int argc,c...
cmake編譯工程列子
理解 cmake是乙個跨平台編譯器工具,它可以生成各種編譯檔案。本文主要是將如何通過cmake來編譯c 工程。它採取out of source 即中間產物與原始碼分離 方式。在c 中,可以認為cmake是將所有原始檔.h和.cpp都放在同乙個目錄下,來進行編譯和鏈結,最終生成工程。1 工程目錄結構 ...
QtCreator建立CMake工程
確保cmake已經安裝並且新增到了系統環境變數 qtcreator會自動檢測 或者qtcreator中手動新增。如果使用vs編譯器的話,需要準備 1 vs已經安裝。2 win10 sdk 本人使用的是win10 已經安裝。3 將d qt qt5.9.6 tools qtcreator bin 根據自...