【问题标题】:CMake not finding headers from library in subprojectCMake没有从子项目中的库中找到标题
【发布时间】:2021-03-26 15:28:53
【问题描述】:

更新:已修复我更正了下面的 CMakeLists.txt 文件:我遗漏了一个斜线。所以解决方案是将${CMAKE_CURRENT_LIST_DIR} 添加到target_include_directories 的路径中。

我正在尝试将 libharu 用作子项目。我已在 libharu 目录中的项目中将其设置为 git 子模块,并对CMakeLists.txt 文件进行了编辑(将CMAKE_*_DIR 引用更改为PROJECT_*_DIR,因此它会根据提出的未解决问题表现为子项目图书馆)。

在我的主要CMakeLists.txt 文件中(根据 cmets 和答案中的建议进行了编辑)

add_subdirectory(libharu)

add_executable ( gftopdf)

target_link_libraries(gftopdf libharu)

target_sources(gftopdf PRIVATE
        main.cpp
        Bitmap.cpp
        GFReader.cpp
        PDFWriter.cpp
        )

target_include_directories(gftopdf PRIVATE ${CMAKE_CURRENT_LIST_DIR}/libharu/include)

(我也尝试过在target_include_directories 上不使用include)但是当我尝试这样做时

#include "hpdf.h"

我收到一个错误'hpdf.h' file not found。我假设这是非常基本的东西,但我是 CMake 的新手。

我确实看到我有这个可能相关的警告:

CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  MACOSX_RPATH is not specified for the following targets:

   hpdf

(当我进行更改时,CLion 在向我显示 CMake 运行输出时不一致,所以我之前没有注意到这一点。)添加

set(CMAKE_MACOSX_RPATH 0)

(或1)删除警告但没有解决问题,所以我怀疑它无关。

【问题讨论】:

  • add_executable 应该高于target_include_directories。这个add_subdirectory(libharu) 也令人不安。
  • "我的代码说找不到 hpdf.h。" - 请提供(添加到问题帖子中)确切的错误消息,其中包括有关所涉及文件的信息。
  • @MarekR 为什么add_subdirectory(libharu) 令人不安?
  • @Tsyvarev 确切的错误消息是'hpdf.h' file not found。
  • 那么,您是否在原始代码中使用了CMAKE_CURRENT_LIST_DIR,它会出现错误?如目前所写,${CMAKE_CURRENT_LIST_DIR}libharu/include 在变量的取消引用和libharu 之间缺少一个斜线 (/)。

标签: c++ cmake


【解决方案1】:

根据我的猜测,我很快就修复了代码。

add_executable(gftodvi)

# This part is probably fine
add_subdirectory(libharu)

target_link_libraries(gftodvi PRIVATE libharu)

# This line is the probably the cause of your problems
# If libharu was written using modern cmake this wouldn't have been an issue.
# Because they would have made the appropriate include directories PUBLIC
target_include_directories(gftodvi PRIVATE 
    ${CMAKE_CURRENT_LIST_DIR}/libharu/include
)

# Prefer target sources in newer cmake
target_sources(gftodvi PRIVATE 
    main.cpp 
    Bitmap.cpp  
    GFReader.cpp 
    PDFWriter.cpp
)

抱歉,我相信上面的代码现在应该可以工作了。

基本上我认为问题在于 gftodvi 没有获得适当的包含目录。 libharu 使用 CMake 2.X,因此您需要自己手动指定包含目录。

【讨论】:

  • 除非您使用一些非常旧的 CMake,否则target_include_directories 可以正确处理 relative 路径。所以你原来的target_include_directories(gftodvi PRIVATE libharu/include) 也应该可以工作。您实际使用哪个 CMake 版本? your CMakeLists.txt 中的 cmake_minimum_requires 行是什么?
  • 你在问我吗?我用的是 3.20。当我查看 libharu 时,我只是猜到问的人正在使用真正旧的东西
  • 哎呀,对不起,我以为这是提问者提供的答案。无论如何,问题仍然存在:您的回答究竟如何解决问题帖子 ('hpdf.h' file not found) 中所述的问题?它是否通过将 relative 路径替换为 absolute 路径来解决问题?当提问者收到政策 CMP0042 的警告时,它至少使用 CMake 3.0。该版本的Documentation 指出target_include_directories 也接受相对路径。
  • 好吧,已经有一段时间了,但我记得他们的代码中还有其他问题。我同意 target_include_directories 的绝对路径可能不是原因。我记得我修复了其他东西。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多