2017-03-20 96 views
0

我想让CMake在同一个文件夹中找到三个静态库。这是我与挣扎的我的CMakeLists.txt的部分:CMake的find_library()显然没有找到库

# 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_LIBOGREOVERLAY_LIBOIS_LIB都设置为NOTFOUND,但如果我尝试打印他们,我觉得他们'设置为预期的路径(即使是选择了后缀名和非后缀名之间的正确路径)。所有图书馆显然都处于预期的道路上。

我在做什么错在这里?

+0

'find_library()'调用的结果被缓存,但如果找不到它,它应该尝试再次找到它。所以在你的测试中你总是从一个空的二进制输出目录开始?在设置你的项目时 - 仍然在测试你的'CMakeLists.txt' - 我建议添加例如''find_library()'调用之前取消设置(OGREMAIN_LIB CACHE)'以强制每次CMake搜索库。 – Florian

+0

'...三个变量OGREMAIN_LIB,OGREOVERLAY_LIB和OIS_LIB都设置为NOTFOUND,但是如果我尝试打印它们,我发现它们被设置为......' - 因此,这些变量是否为-NOTFOUND或设置为某些路径?你如何检查它们(通过'message()',在CMake缓存等)? – Tsyvarev

+0

关于擦除缓存的问题,我在重新加载项目(调用CMake)之前通过CLion的界面执行,但最终在CMake的缓存中设置为 -NOTFOUND(也通过CLion的图形界面进行了检查)。至于打印他们的名字,我在最后的'find_library()'语句之后使用'message(STATUS“路径:$ {OGREMAIN_LIB}”)'(等),并打印预期的路径。 – pr0gma

回答

0

我无法重现您的问题。呼叫find_library()确实缓存了它的发现。

以你的榜样,并增加了一些空的占位符运行测试,我会说这只是罚款:

cmake_minimum_required(VERSION 2.6) 

# Dependencies' directories 
set(OGRE3D_DIR "ogre3D-1.10") 
set(OGRE3D_LIB_DIR "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}") 

file(WRITE "${OGRE3D_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OgreMain${CMAKE_STATIC_LIBRARY_SUFFIX}" "") 
file(WRITE "${OGRE3D_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OgreOverlay${CMAKE_STATIC_LIBRARY_SUFFIX}" "") 
file(WRITE "${OGRE3D_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OIS${CMAKE_STATIC_LIBRARY_SUFFIX}" "") 

# Required libraries 
find_library(OGREMAIN_LIB 
     NAMES OgreMain OgreMain_d 
     HINTS "${OGRE3D_LIB_DIR}") 

find_library(OGREOVERLAY_LIB 
     NAMES OgreOverlay OgreOverlay_d 
     HINTS "${OGRE3D_LIB_DIR}") 

find_library(OIS_LIB 
     NAMES OIS OIS_d 
     HINTS "${OGRE3D_LIB_DIR}") 

foreach(_var IN ITEMS OGREMAIN_LIB OGREOVERLAY_LIB OIS_LIB) 
    get_property(_var_cached CACHE ${_var} PROPERTY VALUE) 
    message(STATUS "CACHED path: ${_var_cached}") 
    message(STATUS "path: ${${_var}}") 
endforeach() 

# Target 
file(WRITE main.cpp "int main() { return 0; }") 
add_executable(Test Main.cpp) 

# Library linking 
target_link_libraries(Test 
     ${OGREMAIN_LIB} 
     ${OGREOVERLAY_LIB} 
     ${OIS_LIB}) 

你能不能给我的小例子,一个试试?我假设你的问题需要对你的环境做些什么。