1. 程式人生 > >一個簡單的CMake工程示例以及執行過程

一個簡單的CMake工程示例以及執行過程

在工程目錄下,構建目錄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目錄中。

####1.cmake常用指令  cmake --version 檢視cmake版本 rm -rf * 刪除當前目錄下的所有檔案 ####2.執行 ```language src/CMakeLists.txt中: #指定生成目標 add_executable(main main.cpp) #連結共享庫 target_link_libraries(main ${LIBPATHS}) ``` 1 一開始,工程目錄/lib(此處是enginering/bin)中沒有共享庫,需要先遮蔽上面的兩條語句,工程目錄/build下執行cmake .. ,會在此目錄下生成Makefile檔案。 2 此時,工程目錄/build下執行make命令,會在工程目錄/lib中生成共享庫(libshared.so和libstatic.a) 3 此時,不在遮蔽上面的兩條語句,工程目錄/build下執行make命令,會在工程目錄/bin下生成可執行檔案main 4 在工程目錄/bin下,執行./main 輸出: ```language ################ CMake Project Demo ################ lib demo ...

``` #####2.1執行總結 cmake .. make make

結束