歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

CMake的使用練習

cmake是一個跨平台的開源的編譯工具,它能夠生成make文件,然後通過make命令編譯C++,當然,其他make支持的語言也可以編譯。此處不詳述了。這裡有一個cmake實踐的博客,根據該文檔可以一步步的熟悉cmake的用法,鏈接 http://www.linuxidc.com/Linux/2012-12/75894.htm 。

通過自己建一個工程來學習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子目錄 

Copyright © Linux教程網 All Rights Reserved