天天看點

如何編寫CMakeLists

[Preface]

建構一個工程的時候,CMake需要知道的幾個點(如果下面幾件事你知道怎麼做了,多大的工程就都不是問題了)

A.源代碼在哪裡?

B.頭檔案在哪裡?

C.怎麼生成靜态或者動态庫?

D.程式連結的靜态庫在哪裡?

E.如果工程的代碼存放在很多地方,那又該怎麼找到它們呢?

我們來建立一個簡單的工程:

一.項目根目錄

.
├──  bin						//可執行檔案輸出目錄
├──  build						//編譯目錄
├── CMakeLists.txt    			//本文重點
├── include						//extra目錄
├── lib							//靜态庫目錄
└── src							//源碼目錄
     ├── CMakeLists.txt			//二級重點
     ├── MyThread.cpp			//以下都是源檔案
     ├── MyThread.hpp
     └── test.cpp
           

二.根目錄的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)       #确定cmake的最低版本                                          

project(pro)	#pro為此項目名稱												
    set(CMAKE_C_COMPILER "gcc")			#gcc
    set(CMAKE_CXX_COMPILER "g++")		#g++
    set(CMAKE_OPTION "$ENV{MJOY_OPTION} -Werror -rdynamic")		#編譯選項
    set(LIB_DIR ${pro_SOURCE_DIR}/lib)	
    set(BIN_DIR ${pro_SOURCE_DIR}/bin)
    set(SRC_DIR ${pro_SOURCE_DIR}/src)
    set(PRO_DIR ${pro_SOURCE_DIR})
    set(INCLUDE_DIR ${pro_SOURCE_DIR}/include)
    link_directories(				#連結目錄
            ${INCLUDE_DIR}
            ${PRO_DIR}
            ${LIB_DIR}
            )   
    set(EXECUTABLE_OUTPUT_PATH ${BIN_DIR})		#可執行輸出目錄
    set(LIBRARY_OUTPUT_PATH ${LIB_DIR})			#靜态庫輸出目錄
    message("")
    message("====================================")
    message("   編譯路徑:")
    message("src        = Loading")
    add_subdirectory( src )						#增加一個子編譯目錄

    message("   編譯選項:")
    message(" BUILD_TYPE    =" ${CMAKE_BUILD_TYPE})
    message(" CMAKE_OPTION  =" ${CMAKE_OPTION})
if (CCACHE_PROGRAM)
    message(" CCACHE_PROGRAM    = ON")
else()
    message(" CCACHE_PROGRAM    = OFF")
if (${CMAKE_MAKE_PROGRAM} MATCHES "make")
    message(" Generator <Ninja> = OFF")
    message(" ")
    message("====================================")
    message(" 高效Generator")
    message(" ")
    message(" 使用Google Ninja 進行編譯檔案, 實測整個項目可以縮短1/3的編譯時間.")
    message(" 具體使用方式為: ")
    message("   1.安裝Ninja:        sudo apt-get install ninjia-build -y")
    message("   2.清空曆史便以資訊: rm -rf build/* && ccache -C")
    message("   3.生成Makefile檔案: cmake .. -G Ninja _DCMAKE_MAKE_PROGRAM=/usr/bin/ninja")
    message("   4.make: ninja -j[編譯核心數]")
else()
    message("   Generator <Ninja> = ON")
endif()
    message("====================================")
    message(" ")
           

三.子編譯目錄src/CMakeLists.txt

add_definitions(-std=c++11 ${CMAKE_OPTION})          #為源檔案的編譯添加由-D定義的标志                                                                   
set(CMAKE_EXE_LINKER_FLAGS "-Wall -lpthread")		 #源檔案連結參數

aux_source_directory(. SOURCE)						 #源碼路徑
include_directories(								 #引用檔案目錄
        ${pro_SOURCE_DIR}/include
        )   
add_executable(src ${SOURCE})						 #執行檔案名
target_link_libraries(src ${CMAKE_EXE_LINKER_FLAGS}) #連結檔案,如lib庫中還有需要連結的可以繼續接後面寫
           

[appendix]

/**
 *  
 *  File Name: src/MyThread.hpp
 *  brief: 
 *  Create Time: 2019年01月15日 13:57:30
 *  
 */
#pragma once
#include <iostream>
#include <thread>
#include <atomic>
#include <unistd.h>

class MyThread : public std::thread                                                                                     
{
    public:
    MyThread() : thread(){}

        template<typename T, typename...Args>
            MyThread(T&&func, Args&&...args) : std::thread(std::forward<T>(func), std::forward<Args>(args)...)
        {   

        }   
        void showcmd(const char* str);
};
           
/**
 *  
 *  File Name: MyThread.cpp
 *  brief: 
 *  Create Time: 2019年01月15日 14:06:54
 *  
 */

#include "MyThread.hpp"

void MyThread::showcmd(const char* str)
{
    system(str);
}
           

test.cpp

#include "MyThread.hpp"
int main()
{
    MyThread th1([](){
                std::cout << "hello" << std::endl;
            }); 
    th1.showcmd("du -sh *");
    th1.detach();

    MyThread th2([](const char* str){
            std::cout << "hello " << str <<std::endl;
            }, "this is mythread");
    th2.showcmd("df -h");
    th2.detach();
           

最後附上cmake的手冊:

繼續閱讀