【问题标题】:Cmake test : was a library compiled/linked against libc++ or libstd++?Cmake 测试:库是针对 libc++ 或 libstd++ 编译/链接的吗?
【发布时间】:2015-05-07 08:23:31
【问题描述】:

我正在使用 cmake 来管理我使用第三方库的项目。

此库可能已针对 libc++ 或 libstd++ 进行编译/链接(取决于版本)。

我知道如何告诉 cmake 针对 libc++ 或 libstdc++ 编译/链接我的项目,但我不知道如何检查我正在使用的库是否针对 libc++ 或 libstd++ 进行编译/链接。有什么 cmake 命令可以检查吗?

【问题讨论】:

    标签: c++ cmake libstdc++ libc++


    【解决方案1】:

    对于共享库,您可以使用GetPrerequisites 标准模块来测试该库是否依赖于 libstc++ 或 libc++。

    例如,以下代码测试 boost 的 program_options 库是否已针对 libstc++ 或 libc++ 进行编译:

    set (_library "/usr/local/lib/libboost_program_options.dylib")
    set (_prequesites "")
    set (_exclude_system FALSE)
    set (_recurse FALSE)
    set (_exePath "")
    set (_searchDirs "")
    get_prerequisites(${_library} _prequesites ${_exclude_system} ${_recurse} "${_exePath}" "${_searchDirs}")
    if (_prequesites MATCHES "/libstdc\\+\\+")
        message("using libstc++")
    elseif (_prequesites MATCHES "/libc\\+\\+")
        message("using libc++")
    else()
        message("using neither libstc++ nor libc++")
    endif()
    

    对于静态库,您可能不得不求助于在库文件上运行 nm 以确定外部符号,然后在输出中搜索特征字符串,例如 __gnu_

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    如果您链接到错误的版本,您会遇到错误吗?如果是这种情况,您可以使用 CMake 中的try_compile。使用示例:

    try_compile(
      TRY_COMPILE_SUCCESS
      ${CMAKE_BINARY_DIR}/tmpTryDir
      ${CMAKE_MODULES_DIR}/SourceFile.cpp
      CMAKE_FLAGS
        "-DINCLUDE_DIRECTORIES=${TRY_INCLUDE_DIRS}"
        "-DLINK_DIRECTORIES=${TRY_LIBRARY_DIRS}"
        "-DLINK_LIBRARIES=${TRY_LIBRARIES}"
      COMPILE_DEFINITIONS
        "-DCOMPILER_OPTION"
    )
    

    然后,CMake 变量 TRY_COMPILE_SUCCESS 包含 TRUEFALSE 取决于编译成功。

    【讨论】:

    • 我可能会成功地针对 libstd++ 进行编译,然后当发现第三方库与 libc++ 链接时出现链接错误,因此需要针对 libc++ 重新编译整个项目。您的解决方案实际上使这个过程自动化。不过,我希望有更好的解决方案。无论如何,谢谢。
    • 这看起来是一个优雅的解决方案!
    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多