怎么做CMake模块

时间:2013-06-21 16:06:51

标签: c++ cmake

我尝试用cmake学习c ++。我做了一个项目,cmake运行,它编译,它工作,这很好,没关系。现在我开始了一个新项目,我想在其中使用第一个类的一些类。我试图阅读一些源代码,我已经明白我需要创建一个可以从应用程序中读取的模块。所以这将是我的存储库:

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

项目sw1sw2都取决于模块Netowrk。在文件夹cmake中必须有FindNetwork.cmake文件,在sw1sw2Network中必须有CMakeList.txt

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

有人能指出我如何使用依赖于常用模块的软件轻松组织存储库吗?

1 个答案:

答案 0 :(得分: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目录

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,那么当你真正将libs安装到机器上并希望其他人能够找到它时,我会建议你这样做,或者有机制用于链接到彼此库的多个项目。

我希望这有点用处,请注意cmake site有一些例子,cmake --help是你的朋友。