2016-04-23 55 views
0

我有一个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但它没有帮助。所以我的问题是:有没有什么办法(例如链接器标志),我可以用来成功建立main.exe没有lib2?假设我无法修改任何C++源代码。

+0

简短的回答是:没有,没有。 –

+0

假设你正在链接静态库,当链接器与lib1链接并且看到它调用了f4时,它将尝试链接lib2。我认为你需要两个。 – Dan

+0

我认为目标文件格式并不表示所有的依赖关系,所以它不能在链接时告诉'f4'不可以被重复使用。 – Barmar

回答

0

标志--as-needed因为链接试图解决存在于你的目标文件的任何不确定的标识符不起作用。

基本上你必须包含f4()的实现。但出于任何原因,你不想为连接器提供lib2,你可以创建一个虚拟的lib2,其中包含你的虚拟实现f4(使f4函数为空的cpp文件将做到这一点)。

例如:

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

谢谢。这实际上是我解决问题的方式。 – stanleyli

0

您可以将lib1.cpp分成两个源模块lib1a.cpp和lib1b.cpp,并将它们都包含在lib1库中。然后链接器将能够导入f3而不导入f2,所以不需要lib2。

lib1a.cpp

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

lib1b.cpp

void f3() { 
} 
+0

这个问题提示“假设我无法修改任何C++源代码” – gdlmx

相关问题