2017-03-20 93 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}) 

你能不能給我的小例子,一個試試?我假設你的問題需要對你的環境做些什麼。