mingw в Ubuntu — «неопределенные ссылки»… к своим собственным функциям

#linux #cross-compiling #mingw-w64 #undefined-reference

#linux #перекрестная компиляция #mingw-w64 #неопределенный-ссылка

Вопрос:

Я пытаюсь настроить скрипт, который автоматически создает небольшую библиотеку, которую я пытаюсь написать для любых archs / OSS, которые я хочу включить в пакет, за один раз. На данный момент только x86_64 Linux и Windows. У меня нет проблем с компиляцией кода для x86_64 Linux с помощью g (что неудивительно). Отчасти это практическое упражнение для меня.

Однако у меня возникают трудности с компоновщиком mingw-w64. Я решил попробовать создать «hello world», чтобы посмотреть, не связано ли это с моими зависимостями. У меня была такая же проблема.

Последняя команда:

 CXXFLAGS_WIN64="-Wall -O3 -m64 -std=c  11 -pedantic"
LINKFLAGS_MINGW64_EXE="-Wall -m64 -pedantic -L ${MINGW64_DIR}/lib" 
INCLUDEDIR_MINGW64=/usr/x86_64-w64-mingw32/sys-root/mingw/include

#Build
x86_64-w64-mingw32-g   ${CXXFLAGS_WIN64} -I ${includedir} -I ${INCLUDEDIR_MINGW64} -c ${srcdir}/helloworld0.cpp -o ${OBJ_TARG_DIR}/helloworld0.o

#Link
x86_64-w64-mingw32-g   ${LINKFLAGS_MINGW64_EXE} -v -o helloworld0.exe ${OBJ_TARG_DIR}/helloworld0.o
 

выводит:

 Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-g  
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir='/usr/lib/x86_64-linux-gnu' --libexecdir='/usr/lib/x86_64-linux-gnu' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --with-headers=/usr/x86_64-w64-mingw32/include --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libgomp --enable-languages=c,c  ,fortran,objc,obj-c  ,ada --enable-lto --enable-threads=win32 --program-suffix=-win32 --program-prefix=x86_64-w64-mingw32- --target=x86_64-w64-mingw32 --with-as=/usr/bin/x86_64-w64-mingw32-as --with-ld=/usr/bin/x86_64-w64-mingw32-ld --enable-libatomic --enable-libstdcxx-filesystem-ts=yes --enable-dependency-tracking
Thread model: win32
gcc version 9.3-win32 20200320 (GCC) 
COMPILER_PATH=/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/:/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/:/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/bin/
LIBRARY_PATH=/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/lib/
COLLECT_GCC_OPTIONS='-Wall' '-m64' '-Wpedantic' '-L/usr/x86_64-w64-mingw32/sys-root/mingw/lib' '-v' '-o' 'helloworld0.exe' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/collect2 -plugin /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/lto-wrapper -plugin-opt=-fresolution=/tmp/ccFdueja.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -m i386pep -Bdynamic -o helloworld0.exe /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/lib/crt2.o /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/crtbegin.o -L/usr/x86_64-w64-mingw32/sys-root/mingw/lib -L/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32 -L/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/lib ./obj/win64/helloworld0.o -lstdc   -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/crtend.o
/usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/lib/crt2.o: in function `__tmainCRTStartup':
./build/x86_64-w64-mingw32-x86_64-w64-mingw32-crt/./mingw-w64-crt/crt/crtexe.c:288: undefined reference to `__mingw_init_ehandler'
/usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/lib/crt2.o: in function `WinMainCRTStartup':
./build/x86_64-w64-mingw32-x86_64-w64-mingw32-crt/./mingw-w64-crt/crt/crtexe.c:194: undefined reference to `__security_init_cookie'
/usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/9.3-win32/../../../../x86_64-w64-mingw32/lib/crt2.o: in function `mainCRTStartup':
./build/x86_64-w64-mingw32-x86_64-w64-mingw32-crt/./mingw-w64-crt/crt/crtexe.c:222: undefined reference to `__security_init_cookie'
collect2: error: ld returned 1 exit status
 

Большая часть этого является результатом флага -v для информационных целей, но проблема компоновщика, по-видимому, заключается в том, что он не может разрешить ссылки на две функции: __security_init_cookie и __mingw_init_ehandler .

Это уже было странно, поскольку эти функции вызывали собственные модули mingw, но я подумал, что проверю, нет ли отсутствующей библиотеки. Нет. Просмотрев библиотеки в /usr/x86_64-w64-mingw32/lib , я обнаружил экспорт этих функций в libmingw32.a . Который, как вы можете видеть в подробном выводе, по-видимому, явно включен, как -lmingw32 в расширенной команде mingw!

Итак, что дает? -lmingw32 Несовместимо с 64-разрядной сборкой? Если да, то зачем помещать его в каталог x86_64 и почему не включена 64-разрядная версия? mingw размещает библиотеки в неправильном порядке? Существует ли циклическая зависимость?

В любом случае, я надеюсь, что есть просто проблема с моей конфигурацией, и это не то, чего мне придется ждать от mingw, чтобы исправить. Если кто-нибудь увидит, что не так, дайте мне знать! Я не нашел многого в результатах поиска для моего конкретного сценария, так что это заставляет меня думать, что я просто перепутал что-то очевидное. Однако кажется странным, что у mingw возникают проблемы с разрешением собственных зависимостей, поэтому я беспокоюсь, что я что-то перепутал в установке? (Я использовал apt-get …)

Использование mingw-w64 версии 9.3.0 в 64-разрядной Ubuntu 20.04.1 (arch amd64).

Я собираюсь продолжить копаться, чтобы посмотреть, смогу ли я разобраться в цепочке зависимостей всего этого CRT. И, конечно, если на эту тему уже есть хороший пост, который я пропустил, не стесняйтесь ссылаться.

Если у вас была возможность прочитать это, спасибо!

-B

Ответ №1:

У меня такая же проблема. -lmingw32 не работает, но добавление -Wl,--no-whole-archive /usr/x86_64-w64-mingw32/lib/libmingw32.a в командную строку решает проблему, и мой проект успешно связан.

Я не могу понять разницу между -lmingw32 и указанием полного пути. Они должны быть идентичными, но второй работает, а первый — нет