【发布时间】: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