如果您安装了 Mingw GCC 端口之一,例如mingw-w64,
那么您还将获得用于 Windows PE 二进制文件的 binutils 的端口,并且您将能够使用
熟悉的objcopy --keep-global-symbol。
在您选择的安装的bin 目录中找到它,例如C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\bin
但是...
你很可能在这里有一个XY problem,
因为链接器将解析输入序列中第一个库中的符号
定义它并忽略以后库中的定义;所以你可以
仅通过在静态之前链接它来优先考虑来自 DLL 的定义
图书馆。插图:
foo_static.c
#include <stdio.h>
void foo(void)
{
puts("foo_static");
}
bar_static.c
#include <stdio.h>
void bar(void)
{
puts("bar_static");
}
foo_dynamic.c
#include <stdio.h>
__declspec(dllexport) void foo(void)
{
puts("foo_dynamic");
}
gum_dynamic.c
#include <stdio.h>
__declspec(dllexport) void gum(void)
{
puts("gum_dynamic");
}
编译*_static.c源文件并将目标文件归档到静态库static.lib:
>cl -c *_static.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
bar_static.c
foo_static.c
Generating Code...
>lib -out:static.lib *_static.obj
Microsoft (R) Library Manager Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
编译*_dynamic.c源文件并链接DLL中的目标文件dynamic.dll:
>cl -c *_dynamic.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
foo_dynamic.c
gum_dynamic.c
Generating Code...
>link -dll -out:dynamic.dll *_dynamic.obj
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
Creating library dynamic.lib and object dynamic.exp
请注意,函数 foo 在 static.lib 和 dynamic.dll 中定义(不同)。
bar 仅在 static.lib 中定义。 gum 仅在 dynamic.dll 中定义
这是一个调用foo、bar和gum的程序源:
main.c
extern void foo();
extern void bar();
extern void gum();
int main()
{
foo();
bar();
gum();
return 0;
}
我们编译的:
>cl -c main.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
main.c
然后我们像这样链接一个程序prog:
>link -out:prog.exe main.obj static.lib dynamic.lib
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
首先是static.lib。程序输出:
>prog.exe
foo_static
bar_static
gum_dynamic
所以foo 是从static.lib 解析的,而定义是从
dynamic.dll 被忽略了。
现在让我们重新链接库的顺序,然后再次运行prog:
>link -out:prog.exe main.obj dynamic.lib static.lib
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
>prog.exe
foo_dynamic
bar_static
gum_dynamic
这一次,foo 是从 dynamic.dll 解析的,而定义是从 static.lib
被忽略了。