MinGW: winpthreads 覆盖 .rc 资源文件信息

MinGW: winpthreads overrides .rc resource file information

我的 MinGW 项目使用了 boost 库和间接 pthread。
我为我的项目创建了一个 .rc 资源文件,其中包含版本信息等。
要静态 link 我的可执行文件,我使用参数:
-static-libgcc -static-libstdc++ -Wl,-Bstatic,--whole-archive -lpthread -Wl,--no-whole-archive

遗憾的是,pthread 覆盖了我的资源信息,windows-explorer 现在为我的 .exe 可执行文件显示了这个:

description:   POSIX WinThreads for Windows
original name: WinPthreadGC
[...]

没有 pthread 的 linking 选项,windows-explorer 给我的信息与我的资源文件中的信息相同,但我的可执行文件依赖于 libwinpthread- 1.dll.
我从 linker 那里得到的唯一提示是:

.../bin/ld.exe: .rsrc merge failure: duplicate leaf: type: 10 (VERSION) name: 1 lang: 409

这似乎是合理的,因为 VERSIONlang 在我的资源文件中是不同的,我想从 pthread 中删除这些东西.

有什么方法可以用我的资源文件替换 pthread 信息吗?

这似乎是包含所有存档的缺点 (--whole-archive):
-Wl,-Bstatic,--whole-archive -lpthread -Wl,--no-whole-archive

(在libpthread.a中,有一个version.o containing a compiled VERSIONINFO资源)

但包括整个存档对于 link 静态 libpthread.a(即不依赖于 DLL)很有用。

我所做的是将 -Wl,-Bstatic,--whole-archive -lpthread -Wl,--no-whole-archive 作为 link 命令的最后一个参数:

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,但是 link 执行正常并且可执行文件具有正确的版本信息,即命令行中提供的第一个。

另一种选择是通过复制 libpthread.a 创建另一个库,然后从存档 (ar -d libmypthread.a version.o) 中删除 version.o,并使用此存档删除 link。