неопределенная перекрестная компиляция ссылок с использованием LTO в GCC

Я пытаюсь использовать 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

Сверху:

  • Я использую gcc-обертки для ar / ranlib
  • нет внешних зависимостей
  • все файлы скомпилированы с одинаковыми параметрами

Я пытался использовать различные комбинации -fuse-linker-plugin, gcc-ar vs ar, опций видимости символов, optimsations и т. Д., Но я не могу заставить его правильно ссылаться без отключения LTO.

Все цели собираются правильно под собственным компилятором (x86_64 Linux).

Есть ли что-то очевидное, что я здесь упускаю?

7

Решение

Я могу воспроизвести эту проблему связывания на 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
1

Другие решения


По вопросам рекламы [email protected]