CMake查找库匹配行为?
一个指定CMake查找库匹配行为?,cmake,Cmake,一个指定find\u库(名称路径path1..pathn) 我的问题是find_library()如何将名称与库文件匹配(在Windows和Linux上) 例如,我无法让find_library()在提供的GraphicsMagicK的Windows二进制安装中识别MagicK和MagicK++DLL文件: 这些文件是:CORE\u RL\u magick\u.dll 搜索查询:magick或CORE\u RL\u magick不起作用。您可能需要查看以下文档链接: 查找库可以接受一个或多
find\u库(名称路径path1..pathn)
我的问题是find_library()
如何将名称与库文件匹配(在Windows和Linux上)
例如,我无法让find_library()
在提供的GraphicsMagicK的Windows二进制安装中识别MagicK和MagicK++DLL文件:
这些文件是:CORE\u RL\u magick\u.dll
搜索查询:
magick
或CORE\u RL\u magick
不起作用。您可能需要查看以下文档链接:
查找库可以接受一个或多个库名称。这些名称得到前面加上的CMAKE_FIND_LIBRARY_前缀和CMAKE_FIND_LIBRARY_后缀的值
附加。这两个变量应该为每个操作系统设置,具体取决于库的前缀或后缀
如果是你,我会为Windows写
SET(CMAKE_FIND_LIBRARY_PREFIXES "")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
对于Linux
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
然后写
find_library(
magick
CORE_RL_magick_ (or NAMES if there are multiple names for the same library on different systems)
PATHS
path1
path2
...
(other options that are specified in documentation and would be usefull to you)
)
编辑:
CMAKE_FIND_LIBRARY_前缀
和CMAKE_FIND_LIBRARY_前缀
是通过首先调用它来自动设置的,之后调用FIND_LIBRARY()
是比手动设置变量更好的解决方案。为什么不使用FIND_file()
而不是FIND_LIBRARY()
如果要查找.dll 将文件扩展名更改为lib使cmake能够识别它。。。windows上的dll和lib有什么区别?如果您在windows上找不到它,这应该是您自己的问题,但简短的回答是链接器使用.lib,而.exe使用.dll。如果您要链接到它,您将需要.lib
文件。在Windows上,它们被称为“导入库”,基本上告诉链接器有关.dll
的导出符号。在执行过程中,您将(仅)需要.dll
。此外,对CMAKE\u FIND\u LIBRARY\u前缀
和CMAKE\u FIND\u LIBRARY\u后缀要格外小心!我刚刚偶然发现了这个库,它将后缀设置为“.dll.a”,我完全不知道为什么find_library
找不到任何“lib”、“lib*.lib”和“*.a”文件的组合。还请记住,Windows库供应商知道Windows不区分大小写,并且喜欢在所有大写字母中提供lib,其中cmake区分大小写。我不得不使用'SET(CMAKE_FIND_LIBRARY_后缀“.lib”“.lib”“.dll”“.dll”)来查找我所有的lib。