一個簡單的CMake工程示例
阿新 • • 發佈:2019-01-07
在工程目錄下,構建目錄src,include,lib,bin。在src目錄下存放原始碼檔案,include目錄下存放標頭檔案,lib目錄用於存放生成的庫(動態庫或者靜態庫),bin目錄存放最終生成的可執行檔案。
src目錄存放main.cpp和lib_demo.cpp的原始檔:
main.cpp
#include <iostream> #include "main.h" #include "lib_demo.h" using namespace std; int main() { print_project_msg(); lib_demo(); return 0; } void print_project_msg() { cout << "################ CMake Project Demo ################" << endl; }
lib_demo.cpp
#include <iostream>
#include "lib_demo.h"
using namespace std;
void lib_demo()
{
cout << "lib demo ..." << endl;
}
include 目錄下的標頭檔案為:
main.h
#ifndef __MAIN_H__
#define __MAIN_H__
void print_project_msg();
#endif /*__MAIN_H__*/
lib_demo.h
#ifndef __lib_demo__ #define __lib_demo__ void lib_demo(); #endif /*__lib_demo__*/
在工程的根目錄和src目錄下各有有一個CMakeLists.txt檔案:
工程根目錄CMakeLists.txt
#CMake最低版本號要求 cmake_minimum_required(VERSION 2.8) #指定專案名稱 project(CMakeDemo) #指定版本資訊 set(CMAKE_SYSTEM_VERSION 1) #若是需要指定編譯器路徑 #set(CROSS_TOOLCHAIN_PREFIX "/path/arm-linux-") #指定編譯器 #set(CMAKE_C_COMPILER "${CROSS_TOOLCHAIN_PREFIX}gcc") #set(CMAKE_CXX_COMPILER "${CROSS_TOOLCHAIN_PREFIX}g++") #使用預設路徑的g++指定編譯器 set(CMAKE_CXX_COMPILER "g++") #指定編譯選項 set(CMAKE_BUILD_TYPE Debug ) #指定編譯目錄 set(PROJECT_BINARY_DIR ${PROJECT_SOURCE_DIR}/build) #新增子目錄,這樣進入原始碼檔案src目錄可以繼續構建 add_subdirectory(${PROJECT_SOURCE_DIR}/src)
src目錄下的CMakeLists.txt:
#查詢當前目錄下的所有原始檔,
#並將名稱儲存到DIR_LIB_SRCS目錄
#aux_source_directory(. DIR_LIB_SRCS)
#指定標頭檔案目錄,PROJECT_SOURCE_DIR為工程的根目錄
include_directories(${PROJECT_SOURCE_DIR}/include)
#指定可執行檔案的輸出目錄,輸出到bin下面
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#生成動態庫
add_library(shared_demo SHARED lib_demo.cpp)
#設定庫輸出名為 shared => libshared.so
set_target_properties(shared_demo PROPERTIES OUTPUT_NAME "shared")
#生成靜態庫
add_library(static_demo STATIC lib_demo.cpp)
#設定輸庫出名為 static => libstatic.a
set_target_properties(static_demo PROPERTIES OUTPUT_NAME "static")
#指定庫檔案輸出路徑
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#在指定目錄下查詢庫,並儲存在LIBPATH變數中
find_library(LIBPATHS shared ${PROJECT_SOURCE_DIR}/lib)
#指定生成目標
add_executable(main main.cpp)
#連結共享庫
target_link_libraries(main ${LIBPATHS})
整個工程的目錄檔案架構如下:
在專案根目錄新建目錄build,進入build,執行cmake ..命令,若沒有錯誤,在執行make命令。
在bin目錄下產生可執行檔案,lib中生成庫檔案。
另外:
AUX_SOURCE_DIRECTORY(directory VAR)
將指定的directory目錄下的所有原始檔儲存到VAR變數中,
例如:AUX_SOURCE_DIRECTORY(src SRC_CPP)將src目錄下的原始檔儲存到SRC_CPP目錄中。