我正在尝试使用 GCC 4.9.2 从 Linux (x86_64-pc-linux-gnu) 交叉编译 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
从上面:
- 我正在使用 ar/ranlib 的 gcc 包装器
- 没有外部依赖
- 所有文件都使用相同的选项进行编译
我尝试过使用 -fuse-linker-plugin、gcc-ar 与 ar、符号可见性选项、优化等的各种组合,但在不关闭 LTO 的情况下无法使其正确链接。
所有目标都在本机编译器 (x86_64 Linux) 下正确构建。
我在这里缺少什么明显的东西吗?
我能够在 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)