Ubuntu 上的 mingw - “未定义的引用”...到它自己的功能

mingw on Ubuntu - "undefined references"... to its own functions

提问人:waffleorai 提问时间:1/14/2021 最后编辑:waffleorai 更新时间:4/5/2021 访问量:1398

问:

我正在尝试设置一个脚本,该脚本可以自动构建一个小型库,我试图为我想包含在包中的任何 arch/OS 一次性编写。目前,只需x86_64 Linux 和 Windows。我使用 g++ 编译 x86_64 Linux 的代码没有问题(这并不奇怪)。这在一定程度上是我自己的一次练习。

但是,我在使用 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 自己的模块在调用这些函数,但我想我会检查丢失的库。 不。在窥探 中的库时,我在 中发现了这些函数的导出。正如您在详细输出中看到的那样,它似乎被显式包含在扩展的 mingw 命令中!/usr/x86_64-w64-mingw32/liblibmingw32.a-lmingw32

那么是什么原因呢?与 64 位版本不兼容吗?如果是这样,为什么要把它放在 x86_64 目录中,为什么不包含 64 位版本?mingw 是否将库的顺序放错了?是否存在循环依赖关系?-lmingw32

无论如何,我希望我的配置只是存在问题,这不是我必须等待 mingw 修复的问题。如果有人发现问题所在,请告诉我!在我的特定场景的搜索结果方面,我没有找到太多,所以这让我觉得我只是搞砸了一些明显的东西。虽然 mingw 在解决自己的依赖项时遇到问题,但这似乎很奇怪,所以我担心我以某种方式搞砸了安装中的某些东西?(我用的是apt-get...

在 64 位 Ubuntu 20.04.1 (arch amd64) 上使用 mingw-w64 版本 9.3.0。

我将继续四处逛逛,看看我是否能弄清楚整个 CRT 事物的依赖链。当然,如果已经有一篇关于我错过的好帖子,请随时链接。

如果您有机会通读本文,谢谢!

-乙

Linux 交叉编译 mingw-w64 undefined-reference

评论


答:

2赞 Oleg Samarin 4/5/2021 #1

我有同样的问题。-lmingw32 不起作用,但添加到命令行可以解决问题,并且我的项目已成功链接。-Wl,--no-whole-archive /usr/x86_64-w64-mingw32/lib/libmingw32.a

我无法意识到 -lmingw32 和指定完整路径之间的区别。它们应该是相同的,但第二个有效,第一个无效