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
这似乎是合理的,因为 VERSION 和 lang 在我的资源文件中是不同的,我想从 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。
我的 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
这似乎是合理的,因为 VERSION 和 lang 在我的资源文件中是不同的,我想从 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。