我的MinGW项目使用boost库和间接线程。
我为我的项目创建了一个.rc资源文件,其中包含版本信息等等。
要静态链接我的可执行文件,我使用以下参数:
-static-libgcc -static-libstdc++ -Wl,-Bstatic,--whole-archive -lpthread -Wl,--no-whole-archive
遗憾的是,p线程覆盖了我的资源信息,windows-explorer现在为我的.exe可执行文件显示了如下内容:
description: POSIX WinThreads for Windows
original name: WinPthreadGC
[...]如果没有p线程的链接选项,windows-explorer提供给我的信息与我的资源文件中的相同,但是我的可执行文件依赖于libwinp线程-1.dll。
我从链接器中得到的唯一提示是:
.../bin/ld.exe: .rsrc merge failure: duplicate leaf: type: 10 (VERSION) name: 1 lang: 409这似乎是合理的,因为版本和lang在我的资源文件中是不同的,我想从p线程中去掉这些东西。
我是否可以用我的资源文件来替换p线程信息?
发布于 2020-08-12 10:57:22
这似乎是包含所有存档(--whole-archive)的一个缺点:
-Wl,-Bstatic,--whole-archive -lpthread -Wl,--no-whole-archive
(在libpthread.a中,有一个包含已编译的VERSIONINFO资源的version.o )
但是,包含整个存档对于静态链接libpthread.a (即不依赖于DLL)非常有用。
我所做的就是将-Wl,-Bstatic,--whole-archive -lpthread -Wl,--no-whole-archive作为链接命令的最后一个参数:
gcc <files> -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
而不是:
gcc -Wl,--whole-archive -lpthread -Wl,--no-whole-archive <files>
(使用<files>中已编译的资源文件)
然后我仍然有消息.rsrc merge failure: duplicate leaf,但是链接执行正常,可执行文件有正确的版本信息,即在命令行提供的第一个版本。
另一种选择是通过复制libpthread.a创建另一个库,并从归档(ar -d libmypthread.a version.o)中删除version.o,并与此存档链接。
https://stackoverflow.com/questions/63013037
复制相似问题