天天看点

如何编写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的手册:

继续阅读