链接时有没有办法跳过未使用的库

Is there any way to skip unused libraries when linking?

本文关键字:未使用 有没有 链接      更新时间:2023-10-16

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

主要.exe:

extern void f3();
int main() {
    f3();
}

在 lib1.cpp 中:

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

在 lib2.cpp 中:

void f4() {
}

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

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

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

标志--as-needed不起作用,

因为链接器尝试解析对象文件中存在的任何未定义的标识符。

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

例如:

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

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

lib1a.cpp

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

lib1b.cpp

void f3() {
}
相关文章: