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

时间:2016-04-23 00:20:25

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

我有一个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,因为f3()只调用了main()

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

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

2 个答案:

答案 0 :(得分:0)

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

lib1a.cpp

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

lib1b.cpp

void f3() {
}

答案 1 :(得分:0)

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

基本上你必须包含f4()的实现。但出于任何原因,您不希望向链接器提供lib2,您可以创建一个虚拟lib2,其中包含f4的虚拟实现(使用空f4创建一个cpp文件)功能会做的伎俩)。

例如:

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