我有一个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 ++源代码。
答案 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