Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake查找库匹配行为?_Cmake - Fatal编程技术网

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。