0

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

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

|root
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它时,它具有ROOTCMake的值ROOT/leptonica,因此它正在搜索错误的路径 - 正如您在 Leptonica CMake 中看到的那样,它用于确定其文件的路径。

解决这个问题的正确方法应该是什么 - 我应该在CMAKE_SOURCE_DIR调用ROOT/leptonica之前add_subdirectory设置并在完成后将其设置回来,还是存在其他一些更优雅的解决方案?

4

2 回答 2

1

并非每个 CMake 项目都适合通过add_subdirectory.

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

但是,通过ExternalProject_Add(可选地用 包裹execute_process)包含总是有效的。


修改变量CMAKE_SOURCE_DIRCMAKE_BINARY_DIR也是)是一个坏主意:这个变量只能由 CMake 本身更改。否则你可能会得到奇怪的错误。

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

于 2017-05-23T16:14:34.727 回答
1

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

如果您在查找 cmake 文件时遇到问题,请LeptonicaConfig-version.cmake.in尝试将适当的目录附加到${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} )
于 2017-05-23T20:04:38.113 回答