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