C++ 如何在CMake中以可移植的方式获取libstdcxx隐式链接目录

C++ 如何在CMake中以可移植的方式获取libstdcxx隐式链接目录,c++,gcc,hyperlink,cmake,libstdc++,C++,Gcc,Hyperlink,Cmake,Libstdc++,背景是我们的项目必须使用不同的GCC版本(ABI可能不兼容),并且在我们的构建服务器中安装了几个版本的GCC。我们使用包装器项目设置LD\u LIBRARY\u PATH,通过export LD\u LIBRARY\u PATH=/PATH/to/gcclib/准备环境,并在包装器脚本中启动我们的应用程序 由于使用了不同风格的gcc/g++,我们想知道是否有一种简单的方法来获取libstdc++的隐式库路径。例如,其中一个GCC工具安装在/opt/gcc4/gcc4.7/bin/g++和libs

背景是我们的项目必须使用不同的GCC版本(ABI可能不兼容),并且在我们的构建服务器中安装了几个版本的GCC。我们使用包装器项目设置
LD\u LIBRARY\u PATH
,通过
export LD\u LIBRARY\u PATH=/PATH/to/gcclib/
准备环境,并在包装器脚本中启动我们的应用程序


由于使用了不同风格的gcc/g++,我们想知道是否有一种简单的方法来获取libstdc++的隐式库路径。例如,其中一个GCC工具安装在/opt/gcc4/gcc4.7/bin/g++和libstdc++中。因此可以在/opt/gcc4/gcc4.7/lib/中找到,而另一个GCC变体可能在/usr/local/bin/g++和/usr/lib/libstdc++中找到。因此。

我假设您在设置
CMAKE{C,CXX}\u编译器时指定了一个绝对路径。在这种情况下,您可以使用它来获取库目录:

get_filename_component(GCC_PATH ${CMAKE_C_COMPILER} PATH)
#now ${GCC_PATH} contains "/opt/gcc4/gcc4.7/bin", for example
set(LIBSTD_PATH "${GCC_PATH}/../lib")
对于系统编译器,您可以使用
if
语句:

if(GCC_PATH STREQUAL /usr/local/bin)
set(LIBSTD_PATH "/usr/lib")
endif()

我假设您在设置
CMAKE{C,CXX}\u编译器
vars时指定了一个绝对路径。在这种情况下,您可以使用它来获取库目录:

get_filename_component(GCC_PATH ${CMAKE_C_COMPILER} PATH)
#now ${GCC_PATH} contains "/opt/gcc4/gcc4.7/bin", for example
set(LIBSTD_PATH "${GCC_PATH}/../lib")
对于系统编译器,您可以使用
if
语句:

if(GCC_PATH STREQUAL /usr/local/bin)
set(LIBSTD_PATH "/usr/lib")
endif()

是否确实要区分std库,而不是编译器?您使用的是单一编译器和不同的库吗?@arrowdoger我们使用的编译器套件不同,不同之处在于命令行参数中的标志。问题是我们需要根据当前使用的编译器变量找出相应的链接库路径。是否确实要区分std库而不是编译器?您使用的是单一编译器和不同的库吗?@arrowdoger我们使用的编译器套件不同,不同之处在于命令行参数中的标志。问题是我们需要根据当前使用的编译器变量找出相应的链接库路径。这个技巧对我的情况很有效,但是那些
CMAKE\u CXX\u编译器
变量不是由代码指定的,而是从
path
获得的。这个技巧对我的情况很有效,但是,那些
CMAKE\u CXX\u编译器
vars不是由代码指定的,而是从
PATH