我正在使用cmake来管理使用第三方库的项目。
这个库可以根据libc ++或libstd ++编译/链接(取决于版本)。
我知道如何告诉cmake根据libc ++或libstdc ++编译/链接我的项目,但我不知道如何检查我使用的库是否是针对libc ++或libstd ++编译/链接的。是否有任何cmake命令来检查?
答案 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
包含TRUE
或FALSE
,具体取决于编译成功。