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.
下调用的
我正在尝试使用 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.
下调用的