Cmake 的內從前面到今天為止也慢慢接近尾聲啦~
所以也趁這個機會來整理一下之前有整理到的幾個Cmake重要內容
(from Day 19 [make→cmake] 用cmake補足makefile的限制)
CMakeLists.txt
→ 產生 Makefile / Ninja / Visual Studio / Xcode 專案cmake -S . -B build` # 產生Makefile/Ninja/VS solution)
cmake --build build -j` # 執行編譯(build,實際呼叫 make/ninja/msbuild)
(from Day 22)
CMakeLists.txt
CMakeLists.txt (描述規則)
↓
cmake -S . -B build (產生 Makefile) (-G Ninja可以產生Ninja)
↓
產生 build.ninja
↓
cmake --build build
↓
ninja 呼叫 gcc/clang 編譯 dog_meme.c、main.c → app
(from Day20) --> 這邊可以大概看懂CMakelist.txt 在做什麼
dog_meme
函式庫app
,並連結 dog_meme
make install
時要放到哪裡cmake_minimum_required(VERSION 3.21)
project(C_PROJ VERSION 1.0.0 LANGUAGES C)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
.o
檔打包起來的檔案add_library(dog_meme STATIC
src/dog_meme.c
)
target_include_directories(dog_meme
PUBLIC
${CMAKE_SOURCE_DIR}/inc
)
dog_meme.a
。dog_meme
的 target 都能找到 inc/
。add_executable(app
src/main.c
)
target_link_libraries(app PRIVATE dog_meme)
target_compile_options(app PRIVATE -Wall -Wextra -Wpedantic)
target_compile_definitions(app PRIVATE APP_VERSION="1.0.0")
target_include_directories(app PRIVATE ${CMAKE_SOURCE_DIR}/inc)
app
有效)APP_VERSION="1.0.0"
install(TARGETS app RUNTIME DESTINATION bin)
install(DIRECTORY inc/ DESTINATION include)
(from Day19)
Debug
(開啟 -g -O0)Release
(開啟 -O3)RelWithDebInfo
(-O2 + debug info)MinSizeRel
(針對大小最佳化)cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
(from Day 24)
上面學會看CMake的檔案的語法跟知道CMake在做什麼之後,可以選擇CMake想要產生的編譯執行檔,例如你可以選擇Make 或是 Ninja
-G "Unix Makefiles"
→ 產生 Makefile (Linux 系統預設)-G "Ninja"
→ 產生 Ninja build system(快很多)-G "Visual Studio 17 2022"
→ 產生 VS solutioncmake -S . -B build -G "Ninja"
(from Day 26)
這篇學會當拿到一個專案後,可以怎麼執行其中的Cmakelist.txt 並界網路上現有可以直接使用的模板資訊