Проблема с библиотеками и Mingw-gcc для кросс-компиляции кода Win32 на Linux - PullRequest
2 голосов
/ 21 августа 2011

Я пытаюсь кросс-компилировать некоторые программы на C / C ++, которые я написал для Linux для Windows.У меня был большой опыт использования GCC и MSVC.

Обычно при компиляции программы с использованием gcc можно использовать аргумент -l linker, чтобы указать библиотеку для ссылки.Кажется, что это не работает должным образом при использовании компоновщика MingW-gcc.

Версия GCC: i586-mingw32msvc-gcc (GCC) 4.4.4

При компоновке программы, которая использует (например, GTK + или libpng, libz,и т. д.), используя что-то вроде:

i586-mingw32msvc-gcc -mwindows -L/opt/xcompile-win32/lib -lmylib -lmylib2 myprog.o -o myprog.exe

Дает многочисленные ошибки о неопределенных ссылках на библиотечные функции.Однако, если я укажу библиотеки как дополнительные объекты, подобные этому:

i586-mingw32msvc-gcc -mwindows -L/opt/xcompile-win32/lib /opt/xcompile-win32/lib/libmylib.a /opt/xcompile-win32/lib/libmylib2.a myprog.o -o myprog.exe

Все работает отлично, и результирующая программа работает отлично!У меня такой вопрос: есть ли способ заставить работать правильные аргументы библиотеки -l?Этот метод кажется немного громоздким!Кажется, я не могу найти в Интернете ничего, что решает эту проблему.Спасибо!

Редактировать:

Чтобы уточнить: порядок аргументов библиотеки в командной строке не имеет значения.Кроме того, программа прекрасно компилируется в Linux (gcc), используя только аргументы -l.Фактическая команда ниже:

i586-mingw32msvc-gcc  -mwindows -o win32/vmclient.exe win32/gtk_test.o \
-L/opt/xcompile-win32/lib -latk-1.0 -lpangoft2-1.0 -lpangocairo-1.0 \
-lgdk_pixbuf-2.0 -lm -lcairo -lpng12 -lpango-1.0 -lfreetype -lfontconfig \
-lgmodule-2.0 -lgthread-2.0 -lglib-2.0

win32/gtk_test.o:gtk_test.c:(.text+0x37): undefined reference to `_gtk_init_abi_check'

(и куча похожих ошибок).Программа прекрасно компилируется для Win32 (используя i586-mingw32msvc-gcc) при прямой ссылке на файлы библиотеки .a в том же порядке.

1 Ответ

1 голос
/ 22 августа 2011

Проблема здесь в порядке аргументов командной строки.Если библиотека связана с -l, компоновщик возьмет только те объектные модули, которые необходимы для удовлетворения любых неразрешенных ссылок, замеченных до сих пор.Начиная с info ld, параметр -l:

Если в архиве определен символ, который не был определен в каком-либо объекте, который появился перед архивом в командной строке, компоновщик включит соответствующий файл (ы)) из архива.Однако неопределенный символ в объекте, появляющемся позже в командной строке, не заставит компоновщик снова искать архив.

Но когда вы пишете полный путь к библиотеке, он полностью связывается.

Итак, для компиляции вашей программы просто напишите:

i586-mingw32msvc-gcc -mwindows myprog.o -o myprog.exe \
    -L/opt/xcompile-win32/lib -lmylib -lmylib2 

С библиотеками в конце.

Кстати, если я не ошибаюсь, это поведение не отличается ввстроенный компилятор Linux.

Редактировать:

Отвечая на ваши изменения, вы забыли добавить несколько библиотек в команду компилятора.Вам не хватает -lgtk-win32-2.0 -lgdk-win32-2.0.

Лично мне гораздо удобнее использовать инструмент pkg-config.При кросс-компиляции это так же просто, как экспортировать PKG_CONFIG_LIBDIR=/op/xcompile-win32/pkgconfig.

В Linux это работает нормально, возможно, потому что отсутствующие библиотеки автоматически заносятся NEEDED записями в другие библиотеки.

...