【问题标题】:G++ linking - Link only used symbolsG++ 链接 - 仅链接使用的符号
【发布时间】:2023-12-21 14:32:01
【问题描述】:

将 c++ 代码与 g++ 链接时遇到问题。我有两个文件:file1file2:

file1:

int A(){
   return B();
}

int C(){
   return 0;
}
file2:

int B(){
   return 4;
}

我正在构建一个使用C() 函数的共享库,所以我只使用file1 而不是file2 进行编译。我在编译或链接时没有问题,但是当我使用共享库时,我在执行时收到一个错误,提示 B 未定义。

如果我用file2 编译和链接我没有问题。但我不想要这个解决方案,因为我有多个递归包含。

我尝试用--ffunctions-sections--fdata-sections 编译,然后用-Wl,--gc-sections 链接,但它没有解决我的问题。

有没有办法只链接我实际使用的符号(这里是函数)?

【问题讨论】:

    标签: c++ g++ shared-libraries ld dynamic-linking


    【解决方案1】:

    您应该将共享库视为通用的东西。即使您总是想从图书馆借一本书,其他人也可能想借其他书。因此,要么删除方法int A(),要么通过链接到它的依赖项使其工作。

    G++ 提供链接时优化(在编译和链接时使用参数-flto)。但是让int A() 方法无法访问,然后希望它被优化掉,这绝对不是解决问题的好方法。

    【讨论】:

    • 谢谢。所以看起来我想做的实际上是不可能的。事实上,我正在构建多个共享库,其中一些使用通用功能。这就是为什么我想优化我的代码而不是通过编译文件来复制它,即使不是所有实际使用的函数。所以我认为,在你所说的之后,正确的解决方案是重新考虑我的文件架构。所以这就是我要做的。
    • 一个好的架构总是很重要的!并摆脱没有人曾经使用过的方法。但是,在库中包含仅由一些库或应用程序使用的方法和类并不是一个糟糕的设计。
    最近更新 更多