cmake配置基本工程和多線程

什麼是cmake?

大家都知道自linux上寫的c/c++程序,在編譯鏈接單個或者多個文件時爲了方便,我們都會寫一個MakeFile文件,然後在命令行執行make命令。cmake就是生成MakeFile文件的工具。
這是cmake的下載地址https://cmake.org/download/
如果你是ubuntu的話,直接下面執行命令安裝cmake:

sudo apt-get install cmake

cmake工程目錄結構

我這裏所說的工程目錄結構其實就是哪些文件叫什麼名字,什麼文件放到什麼文件夾下。當然這只是我自己的愛好,你也可以探索自己的風格。下圖是我的工程目錄結構:
這裏寫圖片描述

lib: 生成的庫文件
src: 源文件(.cpp .cc)
include: 頭文件(.h .hpp)
build: 一般在這個文件夾下執行cmake ..(..之前有一個空格,表示你要使用的CMakeLists.txt文件在當前的上層路徑),生成的Makefile文件也在這個路徑下。
bin: 一般放生成的可執行文件
CMakeLists.txt: cmake的配置文件,關於配置文件怎麼寫的教程(http://blog.csdn.net/kaizi318/article/details/7721624

我的CMakeLists.txt是這樣寫的:

#井好表示註釋
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #設定最小版本號
PROJECT( test )                       #設定工程名

SET(CMAKE_CXX_COMPILER "g++")         #設置編譯器(可選的有gcc,g++)

# 設置用debug還是release模式。debug允許斷點,而release更快
#set( CMAKE_BUILD_TYPE Debug )
set( CMAKE_BUILD_TYPE Release )

# 設置編譯選項
# 允許c++11標準、O3優化、多線程。match選項可避免一些cpu上的問題
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -O3 -pthread" )

#設定可執行二進制文件的目錄
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 

#設定存放編譯出來的庫文件的目錄
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) 

#並且把該目錄設爲連接目錄
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)

#設定頭文件目錄
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)

#增加子文件夾(注意我們的src路徑是通過子文件夾的形式添加的,在這裏面也是可以些CMakeLists.txt的)
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)

多線程

進程是分配資源的基本單位,線程是輕量級的進程,爲什麼是輕量級的,因爲線程是依附進程而存在的,共享進程的資源,線程之間切換比進程切換更加快速。
教程鏈接1http://www.runoob.com/cplusplus/cpp-multithreading.html
教程鏈接2http://www.cnblogs.com/haippy/p/3284540.html

新建src/CMakeLists.txt

##src/CMakeLists.txt
ADD_EXECUTABLE( main  main.cpp )

新建src/main.cpp

//src/main.cpp
#include<iostream>  
#include<pthread.h>  
#include<unistd.h>  

using namespace std;
__thread int i = 1;

void* thread1(void* arg);
void* thread2(void* arg);

int main()
{
    pthread_t pthread1;
    pthread_t pthread2;
    pthread_create(&pthread1, NULL, thread1, NULL);
    pthread_create(&pthread2, NULL, thread2, NULL);
    pthread_join(pthread1, NULL);
    pthread_join(pthread2, NULL);
    return 0;
}
void* thread1(void* arg)
{
    cout<<++i<<endl;             //輸出 2  
    return NULL;
}
void* thread2(void* arg)
{
    sleep(1);                 //等待thread1完成更新
    cout<<++i<<endl;          //輸出 2,而不是3
    return NULL;
}

需要特別解釋的是:__thread是gcc,g++內置的用於多線程編程的基礎設施。用__thread修飾的變量,每個線程都擁有一份實體,相互獨立,互不干擾

最後進入build路徑,執行下面命令:

$ cmake ..
$ make
$ ../bin/main

以這種方式慶祝里約奧運也是不錯的選擇!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章