[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的手冊: