Я пытаюсь использовать GCC 4.9.2 для кросс-компиляции приложения из Linux (x86_64-pc-linux-gnu) для Windows (x86_64-w64-mingw32).
При создании целей, которые связываются со статическими библиотеками, а также с использованием оптимизации времени компоновки, я получаю неопределенные ошибки ссылок от компоновщика для всех символов, которые цель использует из библиотеки.
например, создание bar.a из bar.cpp
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, опций видимости символов, optimsations и т. Д., Но я не могу заставить его правильно ссылаться без отключения LTO.
Все цели собираются правильно под собственным компилятором (x86_64 Linux).
Есть ли что-то очевидное, что я здесь упускаю?
Я могу воспроизвести эту проблему связывания на Mingw32-gcc 4.9.2 под Win7 64-bit. Тем не менее, я получил его на ссылку успешно, добавив -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