如何从最终二进制中排除未使用的方法?

时间:2011-08-09 08:56:40

标签: c++ gcc

我认为编译器/链接器会删除未在其类中使用的private方法,并且这些方法不会成为最终二进制文件的一部分。

我创建了一个示例类,其中包含一个已实现但未使用的私有方法。

class XXX
{
  public:
  XXX();

  private:
  void MyUnusedMethod();
};

在实施文件中:

void XXX::MyUnusedMethod()
{
  const char* hugo = "ABCCHARLYABC";
  printf( hugo );
}

编译后,字符串仍然存在于最终二进制文件中。为什么?我该如何防止这种情况?

祝你好运, 查理

4 个答案:

答案 0 :(得分:7)

一种可移植的方法是为每个函数提供一个.o文件。然后从那些.o文件中构建一个存档.a。当链接到该存档时,链接器仅链接那些解析符号的.o文件,即具有无人调用的函数的.o文件未链接。

另一种方法是将最新版本的gcc与link-time code generation一起使用。

答案 1 :(得分:7)

这通常是通过将 -ffunction-sections -fdata-sections 选项传递给gcc来完成的。查看此link了解更多详情。

答案 2 :(得分:3)

  

编译后,字符串仍然存在于最终二进制文件中。为什么

其他人已经提出了如何摆脱最终二进制文件中未使用的代码的建议。我想对Why稍微给出一些答案 - 这里有两点可能无法删除该函数。

除非您使用static linkage声明了XXX类型的所有对象,否则编译器无法从生成的目标文件中删除该类型(以及方法),因为某些其他目标文件可能会访问该值使用extern。链接器可以一次查看所有目标文件,也许能够解决这个问题。

但是,由于您将问题标记为gcc,因此您可能没有使用-fvisibility=hidden进行编译和/或链接。在这种情况下,即使链接器也不能剥离符号(因此也不能剥离代码),因为其他模块可能会在运行时解析符号。

答案 3 :(得分:1)

这可能是一个非常糟糕的主意,但无论如何我必须写它:)你可以创建一个模板化的类,将未使用的方法移除。