【问题标题】:CMake External Library Linking?CMake 外部库链接?
【发布时间】:2013-06-24 14:31:51
【问题描述】:

似乎 cmake 无法确定当前编译器可以使用哪些库,或者我希望 cmake 仅使用已使用相同编译器编译的库。

我正在使用 find_library 查找所需的库,但似乎无法确定该库是否实际可用。它设法按名称找到库,但是当我为 MinGW 进行配置时,它使用了“.lib”扩展名。我是否必须为我为其编译库的每个编译器创建文件夹并为我的脚本中的每个编译器添加 if 语句?这似乎与我认为 find_library 能够做到的事情背道而驰。也许我在滥用它?谁有更好的主意?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您似乎有点困惑:当您建议在 Windows 上为 MinGW 和 Visual Studio 使用不同的库时,您是对的。但是当你说 .lib 文件不能被 MinGW 使用时你错了。 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()
    

    【讨论】:

    • 感谢您的回复,您对我的一些问题的回答最少。我想知道如果你正在构建一个 64 位可执行文件,那么如果你有一些变量 FIND_LIBRARY_USE_LIB64_PATHS 我认为是,CMake 会自动将任何带有“/lib/”的目录更改为“/lib64/”。
    • 确实如此,但仅在“已知需要它的平台”上,我现在无法检查,但我很确定 Windows 不在此平台列表中(因为有无论如何,Windows 上的库都没有标准位置...)
    • 意外按下回车并发布...只允许在 5 分钟内进行编辑,所以:if(MSVC) find_library(MYLIB_LIBRARY mylib PATHS "prebuilt/lib-msvc/mylib/" elseif(MINGW) # uhh not sure how to check compilers (seems to only be provided for MSVC...) find_library(MYLIB_LIBRARY mylib PATHS "prebuilt/lib-mingw/mylib/" endif() 而不是为每个编译器编写 if 语句(这似乎是检查它们的方法;至少我已经看到编译器 ID 的字符串比较可以更改)如果有人知道检查 complrs 的更好方法
    • 是的,您可以使用 MSVC 和 MINGW 来测试您的编译器。您可以使用 CMAKE_SIZEOF_VOID_P 来测试 32 / 64 位,请参阅stackoverflow.com/a/17127764/1486118
    • 文档中的 MINGW 在哪里,我可以看到 MSVC 但看不到 MINGW (cmake.org/cmake/help/v2.8.11/cmake.html#variable:MSVC)。
    猜你喜欢
    • 2021-09-17
    相关资源
    最近更新 更多