首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ubuntu上的mingw -“未定义的引用”...到它自己的函数

在Ubuntu上的mingw -“未定义的引用”...到它自己的函数
EN

Stack Overflow用户
提问于 2021-01-14 01:10:58
回答 1查看 222关注 0票数 1

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

然而,我在使用mingw-w64链接器时遇到了困难。我决定尝试构建一个"hello world“,看看这是否是我的依赖项的问题。我也有同样的问题。

最后一条命令:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
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...)

在64位Ubuntu20.04.1 (arch amd64)上使用mingw-w64版本9.3.0。

我将继续探索,看看我是否能弄清楚整个CRT的依赖链。当然,如果我错过了一篇关于这方面的好文章,请随时链接。

如果你有机会通读这篇文章,谢谢!

-B

EN

回答 1

Stack Overflow用户

发布于 2021-04-05 13:25:28

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

我无法理解-lmingw32和指定完整路径之间的区别。它们应该是相同的,但是第二个可以工作,第一个不能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65706580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档