【问题标题】:Remove libstdc++ from CMake build从 CMake 构建中删除 libstdc++
【发布时间】:2016-09-14 22:58:24
【问题描述】:

我正在尝试构建一些第 3 方代码并将其链接到我们自己的 STLPort 私有版本,他们的代码使用 CMake,我是新手。

我能够让编译器对我们的 STLPort 包含工作,但我无法阻止链接器在 libstdc++ 中进行链接。我试过了:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib")
list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_LIBRARIES stdc++)

但没有运气。

Amazon Linux AMI(基于 RHEL 5.x)、CMake 2.8.12。

建议/指针将不胜感激。

谢谢。

【问题讨论】:

  • 您可以尝试CMAKE_USER_MAKE_RULES_OVERRIDE 脚本。你可以在CMAKE_CXX_IMPLICIT_LINK_LIBRARIES 缓存到CMakeCXXCompiler.cmake 之前修改它。有关示例,请参见 here
  • 这是飞行员错误。正如我在下面提到的,CMake 文件很大,并且 STLPort 定义中存在隐藏/屏蔽错误,导致问题远离定义。只需set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib") 即可

标签: c++ cmake


【解决方案1】:

我相信您的构建脚本中有更多逻辑。

以下 CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (Test)
add_executable(Test test.cpp)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib")
list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_LIBRARIES stdc++)

对于 test.cpp:

int main()
{
        return 0;
}

产生预期的链接器警告:

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400144

这意味着我的二进制文件没有链接到标准库。

我认为您应该提供有关构建过程的更多详细信息。

【讨论】:

  • 是的,构建脚本有数百行长,分布在多个子目录中,并且使用 bash 脚本进行了预处理......对于 SO 来说有点太多了 :-)
  • 我怀疑这些变量只是被其他脚本覆盖了。在 CMAKE_EXE_LINKER_FLAGS 和 CMAKE_CXX_IMPLICIT_LINK_LIBRARIES 的来源上尝试 grep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多