Cmake 测试:是一个针对 libc++ 和 libstdc++ 的库 compiled/linked?

Cmake test : was a library compiled/linked against libc++ or libstd++?

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

这个库可能 compiled/linked 针对 libc++ 或 libstd++(取决于版本)。

我知道如何告诉 cmake compile/link 我的项目针对 libc++ 或 libstdc++,但我不知道如何检查我使用的库是否 compiled/linked 针对 libc++ 或 libstd++。有任何 cmake 命令可以检查吗?

如果你 link 到错误的版本,你会出错吗?如果是这种情况,您可以使用 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 取决于编译成功。

对于共享库,您可以使用 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_