cmakeの使用練習

8214 ワード

cmakeはプラットフォームにまたがるオープンソースのコンパイルツールで、makeファイルを生成し、makeコマンドでC++をコンパイルすることができます.もちろん、他のmakeがサポートする言語もコンパイルできます.ここでは詳しく述べない.ネット上で1つのcmakeの実践的なブログがあって、このブログによって一歩一歩cmakeの使い方を熟知することができて、私はすでにcsdnの上でアップロードして、ダウンロードしてここを猛撃してください.
自分で工事を建てることでcmakeを学ぶのが一番いい方法です.linuxコマンドラインでは、C++エンジニアリングを管理するのは煩わしいことです.cmakeの出現は,この問題をよく解決した.
たとえば、さまざまなデータ構造を実現するためのプロジェクトを作成しました.ディレクトリは次のとおりです.
.
├── build
├── CMakeLists.txt
├── include
│   ├── graph
│   ├── linklist
│   │   └── linklist.h
│   ├── queue
│   └── stack
├── src
│   ├── CMakeLists.txt
│   ├── graph
│   ├── linklist
│   │   └── linklist.cpp
│   ├── queue
│   └── stack
├── tests
│   ├── CMakeLists.txt
│   └── linklist_test.cpp
└── unittests
    ├── CMakeLists.txt
    ├── gtest-1.6.0
    └── src
        ├── CMakeLists.txt
        └── linklist
            ├── CMakeLists.txt
            └── linklist_unittest.cpp

ここでbuildディレクトリは、外部コンパイル時に使用されます.すなわち、buildディレクトリの下でcmake/makeコマンドを実行し、実行可能プログラムを生成します.
CMakeLists.txtはcmakeコマンドで使用されるファイルです.
includeフォルダはヘッダファイルを格納するために使用されます.
srcはプログラムファイルを格納するために使用されます.
testsフォルダは、自分で書いたテストプログラムを保存するために使用されます.
unittestsは、ユニットテストプログラムファイルを格納するために使用されます.
gtestはgoogleのユニットテストフレームワークで、ここで使用します.
ディレクトリツリーから、linklistプログラムを実装し、ユニットテストプログラムとテストプログラムを書いたことがわかります.また、プログラムのあるフォルダの下にはCMakeListsがある.txtファイル.
最外層のCMakeLists.txtファイルの内容は以下の通りです.
PROJECT(ds)
#   

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#     

INCLUDE_DIRECTORIES(
	${PROJECT_SOURCE_DIR}/include
	${PROJECT_SOURCE_DIR}/include/linklist
	
	/usr/local/include
	/usr/include
)
#     

LINK_DIRECTORIES(
	${PROJECT_SOURCE_DIR}/lib

	/usr/local/lib
	/usr/lib
)
#     

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#            ,PROJECT_BINARY_DIR        ,    Build  

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#          

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tests)
ADD_SUBDIRECTORY(unittests)
#            

srcの下のCMakeLists.txtファイルの内容は以下の通りです.
PROJECT(ds)
SET(DS_SRCS
	linklist/linklist.cpp
)
#         DS_SRCS

ADD_LIBRARY(ds SHARED ${DS_SRCS})
ADD_LIBRARY(ds_static STATIC ${DS_SRCS})
# DS_SRCS                  

SET_TARGET_PROPERTIES(ds_static PROPERTIES OUTPUT_NAME "ds")
#          ds,          ,
#           ,      。

SET_TARGET_PROPERTIES(ds PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(ds_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#                         

unittestsディレクトリの下にあるCMakeLists.txtファイルの内容は以下の通りです.
PROJECT(ds)
ADD_SUBDIRECTORY(gtest-1.6.0)
#  gtest   

SET(GTEST_ROOT ${PROJECT_SOURCE_DIR}/gtest-1.6.0)
# gtest       GTEST_ROOT  

INCLUDE_DIRECTORIES(
	${PROJECT_SOURCE_DIR}
	${GTEST_ROOT}/include
)
#     

ADD_SUBDIRECTORY(src)
#  src   
unittest/srcディレクトリの下のCMakeLists.txtの内容は以下の通りです.
PROJECT(ds)

ADD_SUBDIRECTORY(linklist)
#ADD_SUBDIRECTORY(stack)
#ADD_SUBDIRECTORY(queue)
#ADD_SUBDIRECTORY(graph)
unittests/src/linklistディレクトリの下のCMakeLists.txtの内容は以下の通りです.
PROJECT(ds)
ADD_EXECUTABLE(linklist_unittest linklist_unittest.cpp)
# cpp          

TARGET_LINK_LIBRARIES(linklist_unittest gtest gtest_main ds)
#               

testsディレクトリの下にあるCMakeLists.txtファイルの内容は以下の通りです.
ADD_EXECUTABLE(linklist_test linklist_test.cpp)
TARGET_LINK_LIBRARIES(linklist_test ds)

CMakeListsファイルの展示が終わりました.簡単なソースプログラムを見てみましょう.
まずヘッダーファイルです.次のようになります.
#ifndef DS_INCLUDE_LINKLIST_H_
#define DS_INCLUDE_LINKLIST_H_

typedef struct LNode
{
	int data;
	LNode *next;
}LNode, *LinkList;

void Construct_LinkList(LinkList &L, int a[], int len);
void Print_LinkList(LinkList L);
void Destroy_LinkList(LinkList &L);
int GetOrigin(int a);
#endif

プログラムファイル:
#include "linklist.h"
//  ,          ,  CMake          
#include <iostream>
using std::cout;
using std::endl;

void Construct_LinkList(LinkList &L, int a[], int len)
{
    LNode *p;
    L = new LNode();
    L->next = NULL;
    for(int i = 0; i < len; ++i)
    {
        p = new LNode();
        p->data = a[i];
        p->next = L->next;
        L->next = p;
    }
}
void Print_LinkList(LinkList L)
{
    if(L == NULL)
        return;
    LNode *p = L->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p = p->next;  
    }
    cout<<endl;
}
void Destroy_LinkList(LinkList &L)
{
    if(L == NULL)
        return;
    LNode *p = L->next;
    LNode *q;
    while(p != NULL)
    {
        q = p->next;
        delete p;
        p = q;
    }
    delete L;
    L = NULL;
}
int GetOrigin(int a)
{
	return a;
}

testファイル:
#include "linklist.h"
#include<iostream>
using namespace std;

#define Len 10
int main(int argc, char *argv[])
{
    int array[Len];
    for(int i = 0; i < Len; ++i)
    {
        array[i] = Len-i;
    }
    LinkList L = NULL;
    Construct_LinkList(L, array, Len);
    Print_LinkList(L);
    Destroy_LinkList(L);
	int zyx = 10;
	cout<<"zyx inputs "<<GetOrigin(zyx)<<endl;
    return 0;
}

unittestファイル:
#include "linklist.h"
#include "gtest/gtest.h"

TEST(LinkListTest, GetOrigin)
{
	int zyx = 10;
	EXPECT_TRUE(10 == GetOrigin(zyx));
	zyx = 20;
	EXPECT_TRUE(20 == GetOrigin(zyx));
	zyx = 30;
	EXPECT_TRUE(30 == GetOrigin(zyx));
	zyx = 40;
	EXPECT_TRUE(40 == GetOrigin(zyx));
}

準備が整い、buildディレクトリに入り、cmakeとmakeコマンドを実行し、エラーがなくbinディレクトリの下で実行可能なプログラムを生成します.cmakeコマンドとmakeコマンドを実行すると、図のように効果が得られます.
***@ubuntu:~/Git_Project/linux-learning/makelist_sample/ds/build$ cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found PythonInterp: /usr/bin/python (found version "2.7.3")
-- Looking for include files CMAKE_HAVE_PTHREAD_H
-- Looking for include files CMAKE_HAVE_PTHREAD_H - found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zyx/Git_Project/linux-learning/makelist_sample/ds/build
***@ubuntu:~/Git_Project/linux-learning/makelist_sample/ds/build$ make
Scanning dependencies of target ds
[ 16%] Building CXX object src/CMakeFiles/ds.dir/linklist/linklist.cpp.o
Linking CXX shared library ../lib/libds.so
[ 16%] Built target ds
Scanning dependencies of target ds_static
[ 33%] Building CXX object src/CMakeFiles/ds_static.dir/linklist/linklist.cpp.o
Linking CXX static library ../lib/libds.a
[ 33%] Built target ds_static
Scanning dependencies of target linklist_test
[ 50%] Building CXX object tests/CMakeFiles/linklist_test.dir/linklist_test.cpp.o
Linking CXX executable ../bin/linklist_test
[ 50%] Built target linklist_test
Scanning dependencies of target gtest
[ 66%] Building CXX object unittests/gtest-1.6.0/CMakeFiles/gtest.dir/src/gtest-all.cc.o
Linking CXX static library ../../lib/libgtest.a
[ 66%] Built target gtest
Scanning dependencies of target gtest_main
[ 83%] Building CXX object unittests/gtest-1.6.0/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
Linking CXX static library ../../lib/libgtest_main.a
[ 83%] Built target gtest_main
Scanning dependencies of target linklist_unittest
[100%] Building CXX object unittests/src/linklist/CMakeFiles/linklist_unittest.dir/linklist_unittest.cpp.o
Linking CXX executable ../../../bin/linklist_unittest
[100%] Built target linklist_unittest

cmakeコンストラクションエンジニアリングの説明はこれで終わりますので、詳しくない点はご指導ください.