【问题标题】:How to get libstdcxx implicit link directory in a portable manner in CMake如何在 CMake 中以可移植方式获取 libstdcxx 隐式链接目录
【发布时间】:2012-10-28 17:20:46
【问题描述】:

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

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

【问题讨论】:

  • 您确定要区分标准库而不是编译器吗?您是否使用单个编译器和不同的库?
  • @arrowdodger 我们使用了不同的编译器套件,通过一个标志来区分 - 在命令行参数中类似。问题是我们需要根据当前使用的编译器变体找出对应的链接库路径。

标签: c++ gcc hyperlink cmake libstdc++


【解决方案1】:

我想您在设置CMAKE_{C,CXX}_COMPILER 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()

【讨论】:

  • 这个技巧对我的情况很有效,但是那些CMAKE_CXX_COMPILER 变量不是由代码指定而是从PATH获得的
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多