1

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

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

项目sw1sw2依赖于模块Netowrk。在文件夹 cmake 中必须有FindNetwork.cmake文件,在sw1,sw2Network必须有CMakeList.txt.

但是..我搞砸了include_directories和其他cmake默默无闻..

有人可以指出一个很好的概述如何使用依赖于通用模块的软件轻松组织存储库吗?

4

1 回答 1

2

此链接将为您提供一些示例。

就您如何看待项目/基础设施而言,最好不要混淆太多。所以这里有几点可以让你开始(我希望)

  • 在 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,那么我建议您将库实际安装到机器上并希望其他人能够找到它,或者有一个机制多个项目可以链接到其他库。

我希望这有点用,请记住cmake 站点有一些示例并且cmake --help是您的朋友。

于 2013-06-22T12:05:42.153 回答