【发布时间】:2017-03-20 22:24:15
【问题描述】:
我希望 CMake 在同一个文件夹中找到三个静态库。这是我正在努力解决的 CMakeLists.txt 的一部分:
# Dependencies' directories
set(OGRE3D_DIR "D:/Data/Libs/ogre3D-1.10")
# Required libraries
find_library(OGREMAIN_LIB
NAMES OgreMain OgreMain_d
HINTS "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}")
find_library(OGREOVERLAY_LIB
NAMES OgreOverlay OgreOverlay_d
HINTS "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}")
find_library(OIS_LIB
NAMES OIS OIS_d
HINTS "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}")
# Target
add_executable(Test Main.cpp)
# Library linking
target_link_libraries(Test
${OGREMAIN_LIB}
${OGREOVERLAY_LIB}
${OIS_LIB})
由于某种原因,OGREMAIN_LIB、OGREOVERLAY_LIB 和 OIS_LIB 三个变量都设置为 NOTFOUND,但如果我尝试打印它们,我发现它们被设置为预期的路径(即使是正确的带后缀和不带后缀的名字被选中)。所有库显然实际上都在预期的路径中。
我在这里做错了什么?
【问题讨论】:
-
find_library()调用的结果被缓存了,但是如果没有找到它应该尝试再次找到它。所以在你的测试过程中,你总是从一个空的二进制输出目录开始吗?在您的项目设置期间 - 在仍在测试您的CMakeLists.txt时 - 我建议添加例如unset(OGREMAIN_LIB CACHE)在find_library()调用之前强制 CMake 每次搜索库。 -
... the three variables OGREMAIN_LIB, OGREOVERLAY_LIB and OIS_LIB are all set to NOTFOUND, but if I try to print them I find they're set ...- 那么,这些变量是-NOTFOUND还是设置为某个路径?你如何检查它们(通过message(),在 CMake 缓存中等)? -
对于擦除缓存的问题,我在重新加载项目(调用 CMake)之前通过 CLion 的界面执行此操作,但它们最终在 CMake 的缓存中设置为
-NOTFOUND(也通过CLion 的图形界面)。至于打印他们的名字,我在最后一个 find_library()语句之后使用message(STATUS "path: ${OGREMAIN_LIB}")(等),并打印出预期的路径。 -
回复:“我在这里做错了什么?” -- 我希望你没有使用 Visual Studio 生成器,因为从多配置生成器中读取
CMAKE_BUILD_TYPE是无效的。您必须在导入的目标上设置IMPORTED_LOCATION_<CFG>属性。 -
另外,Ogre3D(甚至是 1.10)包括一个 CMake 包配置脚本。使用它肯定会比尝试手动完成所有事情更好! ogrecave.github.io/ogre/api/1.10/setup.html