Cmake test:是一个针对libc ++或libstd ++编译/链接的库吗?

时间:2015-05-07 08:23:32

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

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

这个库可以根据libc ++或libstd ++编译/链接(取决于版本)。

我知道如何告诉cmake根据libc ++或libstdc ++编译/链接我的项目,但我不知道如何检查我使用的库是否是针对libc ++或libstd ++编译/链接的。是否有任何cmake命令来检查?

2 个答案:

答案 0 :(得分:5)

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

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

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_

答案 1 :(得分: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,具体取决于编译成功。