我正在尝试使用GCC 4.9.2从Linux(x86_64-pc-linux-gnu)for Windows(x86_64-w64-mingw32)交叉编译应用程序。
当构建链接到静态库并且还使用链接时优化的目标时,我会从链接器获取目标从库中使用的所有符号的未定义引用错误。
例如,从bar.cpp构建bar.a
int bar (void) {return 42;}
并与foo.cpp链接
extern int bar (void);
int main (int, char**) {bar ();}
使用命令行
x86_64-w64-mingw32-g++ -flto -o foo.o -c foo.cpp
x86_64-w64-mingw32-g++ -flto -o bar.o -c bar.cpp
x86_64-w64-mingw32-gcc-ar rc bar.a bar.o
x86_64-w64-mingw32-gcc-ranlib bar.a
x86_64-w64-mingw32-g++ -flto -fuse-linker-plugin foo.o bar.a -o foo
导致错误
/tmp/ccc3Twsc.lto.o:foo.o:(.text+0x15): undefined reference to `bar()'
collect2: error: ld returned 1 exit status
从上面:
我尝试过使用-fuse-linker-plugin,gcc-ar vs ar,符号可见性选项,操作等的各种组合,但我无法在不关闭LTO的情况下正确链接。
所有目标都在本机编译器(x86_64 Linux)下正确构建。
我有什么明显的遗失吗?
答案 0 :(得分:1)
我能够在Win7 64位下在Mingw32-gcc 4.9.2上重现此链接问题。但是,我确实通过添加-ffat-lto-objects
作为解决方法来成功链接:
g++ -flto -o foo.o -c foo.cpp
g++ -flto -ffat-lto-objects -o bar.o -c bar.cpp
ar rc bar.a bar.o
g++ -flto -o foo.exe foo.o bar.a