CMake和外部依赖

时间:2017-05-23 15:39:56

标签: c++ cmake leptonica

我想在项目中添加外部依赖项。我要添加的是Leptonica库作为子模块。

我的项目具有以下目录结构:

|根
   的CMakeLists.txt
   | -bin
   | -build
   | -buildsystem
   | -executable
   | -leptonica
   | --CMakeLists.txt
   | --cmake
   | --- Configure.cmake
   | -production

在我的根CMakeLists.txt文件中,我添加了 ADD_SUBDIRECTORY($ {ROOT_DIR} / leptonica)

不幸的是,CMake没有在正确的目录中搜索Configure.cmake

CMake Error at leptonica/CMakeLists.txt:107 (include):

include could not find load file:

Configure

CMake Error: File

<root>/cmake/templates/LeptonicaConfig-version.cmake.in does not exist.

CMake Error at leptonica/CMakeLists.txt:113 (configure_file):

configure_file Problem configuring file

当我自己构建项目时,一切都很顺利。在我看来,问题在于CMAKE_SOURCE_DIR。使用add_subdirectory时,它的值为ROOT CMake而不是ROOT/leptonica,因此它正在搜索错误的路径 - 正如您在Leptonica CMake中看到的那样,它用于确定其文件的路径。 / p>

解决此问题的正确方法应该是什么?我应该在调用CMAKE_SOURCE_DIR之前将ROOT/leptonica设置为add_subdirectory并在完成时将其设置回来,或者做一些其他更优雅的事情解决方案存在吗?

2 个答案:

答案 0 :(得分:1)

并非每个CMake项目都适合通过add_subdirectory包含。

其中包括使用CMAKE_SOURCE_DIRCMAKE_BINARY_DIR变量的项目。

但是,通过ExternalProject_Add(可选地包含execute_process)的包含始终有效。

修改变量CMAKE_SOURCE_DIR(以及CMAKE_BINARY_DIR)是一个坏主意:此变量只能由CMake本身更改。否则你可能会遇到奇怪的错误。

相反,您可以使用另一个变量(项目中未使用的变量)替换(自动,使用某些脚本)对变量的所有引用。在进入子项目之前,您可以安全地设置这个新变量。

答案 1 :(得分:1)

${CMAKE_SOURCE_DIR}${CMAKE_BINARY_DIR}是相对于顶级CMakeLists.txt设置的。如果您需要与当前CMakeLists.txt(leptonica)相关的内容,请使用${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR}

如果您在查找LeptonicaConfig-version.cmake.in等cmake文件时遇到问题,请尝试将相应的目录附加到${CMAKE_MODULE_DIR}

list(APPEND ${CMAKE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates)

我希望任何时候都使用${CMAKE_CURRENT_SOURCE_DIR}而不是${CMAKE_SOURCE_DIR},因为如果您稍后尝试将其集成到超级版本中,则使用后者会破坏您的构建。如果我需要将当前的顶级目录传递给子目录,那么我会执行以下操作并稍后在链中使用它。

set( LEPTONICA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )