【问题标题】:Is there any way to skip unused libraries when linking?链接时有没有办法跳过未使用的库?
【发布时间】:2016-04-23 00:20:25
【问题描述】:

我有一个 main.exe 和两个库(lib1 和 lib2):

在 main.exe 中:

extern void f3();

int main() {
    f3();
}

在 lib1.cpp 中:

extern void f4();
void f2() {
    f4();
}

void f3() {
}

在 lib2.cpp 中:

void f4() {
}

所以理论上我只需要lib1就可以成功构建main.exe,因为main()只调用了f3()。

但是我发现在 gcc 和 MSVC 下,我也必须有 lib2,否则链接器报告它找不到 f4()。

我已经尝试过链接器标志--as-needed,但它没有帮助。所以我的问题是:有没有什么方法(例如链接器标志)可以在没有 lib2 的情况下成功构建 main.exe?假设我不能修改任何 C++ 源代码。

【问题讨论】:

  • 简短的回答是:不,没有。
  • 假设您正在链接静态库,当链接器与 lib1 链接并看到它调用 f4 时,它将尝试链接 lib2。我认为你需要两者。
  • 我认为目标文件格式并不表示所有的依赖关系,所以它不能在链接时告诉f4 是不可访问的。
  • Microsoft 编译器有一个选项 (/Gy) 可以单独打包函数。如果您可以使用此选项重新编译 lib1,并使用 /OPT:REF 链接器选项链接您的程序,这可能会消除 lib1 对 lib2 的依赖。
  • @1201ProgramAlarm 感谢您的建议。但是我试过了,但似乎仍然存在同样的问题。

标签: c++ gcc visual-c++ linker


【解决方案1】:

--as-needed 标志不起作用,因为链接器会尝试解析目标文件中存在的任何未定义标识符。

基本上,您必须包含 f4() 的实现。但是出于任何原因,您不想将lib2 提供给您的链接器,您可以创建一个虚拟lib2,其中包含您对f4 的虚拟实现(制作一个带有空f4 函数的cpp 文件就可以了) .

例如:

gcc main.cpp lib1.o lib2_dummy.cpp -o main.exe

【讨论】:

  • 谢谢。这实际上是我解决问题的方式。
【解决方案2】:

您可以将 lib1.cpp 拆分为两个源模块 lib1a.cpp 和 lib1b.cpp,并将这两个源模块都包含在 lib1 库中。然后链接器将能够在不导入f2 的情况下导入f3,因此不需要lib2。

lib1a.cpp

extern void f4();
void f2() {
    f4();
}

lib1b.cpp

void f3() {
}

【讨论】:

  • 问题提到“假设我不能修改任何 C++ 源代码”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多