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
包含 TRUE
或 FALSE
取决于编译成功。
对于共享库,您可以使用 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_
。
我正在使用 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
包含 TRUE
或 FALSE
取决于编译成功。
对于共享库,您可以使用 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_
。