2013-06-24 142 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