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子目錄