2013-06-21 99 views
0

我嘗試用cmake學習C++。我做了一個項目,cmake運行,它編譯,它的工作,這很好,好吧。現在我開始了一個新項目,我想使用第一個項目的一些類。我試圖閱讀一些源代碼,我明白我需要製作一個模塊,可以從這兩個應用程序中讀取。因此,這將是我的倉庫:如何做CMake模塊

/ 
/cmake 
/modules/Network 
/software/sw1 
/software/sw2 

兩個項目sw1sw2取決於模塊Netowrk上。在文件夾cmake中必須有FindNetwork.cmake文件,並且在sw1,sw2Network必須有CMakeList.txt

但是...我搞砸了include_directories和其他cmake的晦澀..

有人點我到一個很好的概述如何輕鬆地組織資源庫和依賴於通用模塊的軟件?

回答

2

This link將爲您提供一些示例。

就您如何看待項目/基礎設施而言,最好不要將事情混淆太多。因此,這裏是幾個百分點的讓你開始(我希望)

  • C++中的模塊庫(所以請參閱您的網絡模塊作爲 庫)
  • 要包括你需要一個庫鏈接它也使 頭文件可用。

在cmake的,這是分別兩個命令target_link_librariesinclude_directories

考慮到這一點的項目結構可能是

/Network/include (api here) 
/Network/src 
/sw1/src 
/sw2/src 

與示範基地的CMakeLists.txt爲您的文件:(項目的根目錄的地方)

cmake_minimum_required(VERSION 2.7) // your choice 
project(myproject) // change name 
add_subdirectory(Network) 
add_subdirectory(sw1) 
add_subdirectory(sw2) 

網絡目錄你會有這個

add_library(Network net1.cc net2.cc etc.) 

在sw1目錄

include_dirs(${MYPROJECT_SOURCE_DIR}/Network/include) 
link_directories(${MYPROJECT_BINARY_DIR}/Network) 
add_executable (sw1prog sw1.cc sw11.cc etc.) 
target_link_libraries (sw1prog Network) 

在SW2 DIR

include_dirs(${MYPROJECT_SOURCE_DIR}/Network/include) 
link_directories(${MYPROJECT_BINARY_DIR}/Network) 
add_executable (sw2prog sw2.cc sw21.cc etc.) 
target_link_libraries (sw2prog Network) 

這是你需要什麼非常簡化版本,它消除了對FindXXModule.cmake文件需要被創建,是指隱含地創建庫。我認爲這對你來說是最好的機制,如果你確實想創建一個FindXXModule.cmake,那麼我會建議它是當你真的把你的庫安裝到機器上,並希望其他人能夠找到它,要麼有機制爲多個項目鏈接到彼此的圖書館。

我希望這有點用處,請記住cmake site有一些例子,cmake --help是你的朋友。

+0

我認爲這將是很好的有一個FindXModule.cmake抽象一點點庫,並有一種方法來輕鬆創建一個新的SW3,只是說:'使用網絡',使用'數據庫',並有一個很好的「插件「系統,但你的方式似乎也很簡單 – nkint

+0

你可以通過安裝路徑並將系統安裝到該路徑來實現這一點。然後您想要使用網絡等項目將運行FindXModule.cmake。所以真的是兩個不同的問題,至少在我心中:-) – dirvine

+0

非常感謝。這行得通。我試圖複雜一點,但更多的問題現在已經提出,我做了另一個問題:http://stackoverflow.com/questions/17264037/cmake-for-a-build-a-simple-framework – nkint