Cmake:find_library 不起作用,但 find_path 起作用(相同路径)

Cmake: find_library doesn't work but find_path does (same path)

我正在尝试使用 CMake 在 C++ 中构建跨平台学校项目。我的项目需要使用 Irrlicht 库并且必须在 Linux 和 Windows 下编译 10.

项目源路径包含一个 lib 文件夹,其中包含 Irrlicht header(在 include 子文件夹中)、一个 Irrlicht.dll、一个 Irrlicht.lib和一个 FindIrrlicht.cmake 模块。

我设置CMAKE_MODULE_PATH指向这个目录,然后在我的CMakeLists.txt.

中调用find_package(Irrlicht REQUIRED)

当我尝试在 Linux 下编译时,一切正常。但是,当我尝试 运行 在 Windows 下使用 CMake(使用 CMake GUI)进行配置时,我拥有的 FindIrrlicht.cmake 模块不起作用(它应该,因为它是由学校,他们说应该,我也知道其他人没有修改就可以工作)。我相信我已经确定了问题的原因,但我不明白为什么会发生,也不知道如何解决。

FindIrrlicht.cmake 查找 include 目录和 Irrlicht.lib(或 Linux 下的 libIrrlicht.so,使用 prefix/suffix 选项)标准 Linux include/library 路径和 CMAKE_MODULE_PATH 下。在 Windows 上编译时,它应该在 CMAKE_MODULE_PATH 中找到所有内容。 它这样调用 find_library

FIND_LIBRARY(Irrlicht_LIBRARIES
    NAMES
      Irrlicht
    PATHS
      "/usr/lib64/"
      "/usr/lib/"
      "/usr/lib/x86_64-linux-gnu/"
      "/usr/local/lib/"
      "/usr/local/lib64/"
      "${CMAKE_MODULE_PATH}/" #Should find in this path for Windows configuration
      "${Irrlicht_DIR}/"
)

问题是,CMAKE_MODULE_PATH 中的路径是正确的,因为 find_path()(见下文)能够找到 Irrlicht 的包含目录。但是它将 Irrlicht_LIBRARIES 设置为 NOTFOUND。我一次又一次地验证文件在那里并且文件在正确的位置。我还检查了文件的权限。

IF (NOT Irrlicht_INCLUDE_DIRS OR NOT Irrlicht_LIBRARIES)
  FIND_PATH(Irrlicht_INCLUDE_DIRS
    NAMES
      irrlicht.h
    PATHS
      "/usr/include/irrlicht/"
      "/usr/local/include/irrlicht/"
      "${CMAKE_MODULE_PATH}/include/" #Does find in Windows
      "${Irrlicht_DIR}/include/"
  )

此外,稍后在 CMakeLists.txt 中我成功地调用了 file(COPY "${CMAKE_MODULE_PATH}/Irrlicht.dll" DESTINATION ${EXECUTABLE_OUTPUT_PATH}),并且也成功地尝试了 Irrlicht.lib。所以路径肯定不是这里的问题。

提前感谢您的帮助!

P.S.: 这是我第一次在 Whosebug 上提问,如果我 did/wrote 有什么不对的地方请告诉我,我将不胜感激。

嗯,我发现了我的问题。我觉得我很愚蠢,没有早点考虑这个...

问题出在 pre/suffixes,通过一些调试输出我意识到它们是为 Linux 而不是 Windows 设置的,因此没有创建库文件。

原因是在 CMakeLists.txt 中,对 find_package 的调用是在对 project() 的调用之前完成的,因此在对 [= 的调用期间未设置 MSVC 变量18=],这导致脚本相信它是在 Linux.

下调用的