2013-06-24 150 views
1

看來cmake的無法確定哪些庫可與當前的編譯器使用或者更確切地說,我想CMake的對已編譯相同的編譯器只使用庫。CMake外部庫鏈接?

我使用find_library找到需要的庫,但它似乎是無法確定如果庫是實際可用。它設法按名稱查找庫,但是當我爲MinGW進行配置時,它使用「.lib」擴展名。是否必須爲編譯庫的每個編譯器創建文件夾,併爲腳本中的每個編譯器添加if語句?這似乎與我相信find_library能夠做到的直覺相反。也許我在濫用它?任何人有更好的想法?

回答

2

看來你是一個有點困惑:你說的沒錯,當你認爲你需要MinGW和Visual Studio中的Windows不同的庫。但是當你說MinGW不能使用.lib文件時你錯了。 Visual Studio和MinGW都使用.lib文件鏈接到Windows上的庫。

find_library命令目的只是找到庫。沒有更多,所以它在這裏做它的工作。

如果你想確保能夠找到你的編譯器使用的函數庫,你必須檢查這些庫可以通過使用try_compile你的編譯器使用:

find_library(YOURLIB_LIBRARY yourlib) 
if (YOURLIB_LIBRARY) 
    try_compile(YOURLIB_WORKS 
     bindir 
     somefile.c 
     LINK_LIBRARIES ${YOURLIB_LIBRARY}) 
    if (YOURLIB_WORKS) 
     # do something with your library 
    else() 
     # warn the user of stop the configuration process 
    endif() 
endif() 
+0

謝謝你的回覆,你至少回答了我的一些問題。我想知道更多的是如果你正在構建一個64位的可執行文件,那麼如果你有一些變量FIND_LIBRARY_USE_LIB64_PATHS,那麼CMake會自動將任何帶有「/ lib /」的目錄改爲「/ lib64 /」。 – johndoe

+0

確實如此,但僅限於「已知需要它的平臺」,我無法檢查的權利,但我敢肯定的Windows是不是在這個平臺列表(有適用於Windows庫沒有固定的位置反正...) – Guillaume

+0

Accidentially按下輸入,並將其張貼...只允許5分鐘左右的時間內編輯: '如果(MSVC) find_library(MYLIB_LIBRARY MYLIB 路徑 「預置的/ lib目錄,MSVC/MYLIB /」 ELSEIF (MINGW)#呃不知道如何檢查的編譯器(似乎只提供給MSVC ...) find_library(MYLIB_LIBRARY MYLIB 路徑 「預置的/ lib目錄-的MinGW/MYLIB /」 ENDIF() ' 而不是寫如果sta對每個編譯器來說(這看起來似乎有關於檢查它們的方式的idk;至少我見過可以改變的編譯器ID的字符串比較)如果有人知道更好的方法來檢查complrs – johndoe