2013-06-21 67 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