使用 MinGW 编译为带有一些未定义引用的 .dll
Compile to .dll with some undefined references with MinGW
我在某处听说所有 Windows .DLL 必须 包含它引用的每个符号的定义,所以像这样的 .DLL 文件永远不会编译,因为它不t 实现 bar()
.
void bar();
__declspec(dllexport)
void foo() {
bar();
}
我认为类比是 .DLL 本质上是具有不同入口点的可执行文件,因此它们必须像可执行文件一样定义所有引用。
但在 Unix 环境中,我可以毫无问题地将其编译为 .so 文件。然后我可以使用主机应用程序中的 dlopen(path, RTLD_NOW | RTLD_GLOBAL);
来加载库并将主机的符号与库的符号合并。如果主机定义 bar()
,库将简单地调用该函数。
我不能只是将所有内容重新定义到 .DLL 文件中,因为在我的应用程序中,库使用了来自主机的数千个符号。使用 MinGW 或者可能是 Visual C++,是否真的没有办法通过在 .DLL 中保留它未定义并在加载时合并它来使用来自主机的符号?我也不想在 .DLL 中设置数千个回调函数,因为使用 C++ 方法很难做到这一点。
我想出了如何使用 MinGW 来做到这一点。
通常,当linking DLL文件时(例如plugin.dll
),你导出一个符号列表到libplugin.a
,但在这种情况下,我实际上想导出符号从主机可执行文件 host.exe
到 libhost.a
.
x86_64-w64-mingw32-g++ -o host.exe host.cpp -Wl,--out-implib,libhost.a
这会生成符号列表,您可以在构建插件时link使用它。
x86_64-w64-mingw32-g++ -shared -o plugin.dll plugin.cpp -L. -lhost
这将使用 libhost.a
文件(在当前目录“.”中)构建 DLL。
现在,用 __declspec(dllexport)
填充主机代码有点烦人,因此您可以添加 --export-all-symbols
linker 标志。
出于某种原因,这样做之后似乎也不需要 _declspec(dllimport)
属性,但我不知道为什么。
因此,您可以使用
编译主机
x86_64-w64-mingw32-g++ -o host.exe host.cpp -Wl,--export-all-symbols,--out-implib,libhost.a
我在某处听说所有 Windows .DLL 必须 包含它引用的每个符号的定义,所以像这样的 .DLL 文件永远不会编译,因为它不t 实现 bar()
.
void bar();
__declspec(dllexport)
void foo() {
bar();
}
我认为类比是 .DLL 本质上是具有不同入口点的可执行文件,因此它们必须像可执行文件一样定义所有引用。
但在 Unix 环境中,我可以毫无问题地将其编译为 .so 文件。然后我可以使用主机应用程序中的 dlopen(path, RTLD_NOW | RTLD_GLOBAL);
来加载库并将主机的符号与库的符号合并。如果主机定义 bar()
,库将简单地调用该函数。
我不能只是将所有内容重新定义到 .DLL 文件中,因为在我的应用程序中,库使用了来自主机的数千个符号。使用 MinGW 或者可能是 Visual C++,是否真的没有办法通过在 .DLL 中保留它未定义并在加载时合并它来使用来自主机的符号?我也不想在 .DLL 中设置数千个回调函数,因为使用 C++ 方法很难做到这一点。
我想出了如何使用 MinGW 来做到这一点。
通常,当linking DLL文件时(例如plugin.dll
),你导出一个符号列表到libplugin.a
,但在这种情况下,我实际上想导出符号从主机可执行文件 host.exe
到 libhost.a
.
x86_64-w64-mingw32-g++ -o host.exe host.cpp -Wl,--out-implib,libhost.a
这会生成符号列表,您可以在构建插件时link使用它。
x86_64-w64-mingw32-g++ -shared -o plugin.dll plugin.cpp -L. -lhost
这将使用 libhost.a
文件(在当前目录“.”中)构建 DLL。
现在,用 __declspec(dllexport)
填充主机代码有点烦人,因此您可以添加 --export-all-symbols
linker 标志。
出于某种原因,这样做之后似乎也不需要 _declspec(dllimport)
属性,但我不知道为什么。
因此,您可以使用
x86_64-w64-mingw32-g++ -o host.exe host.cpp -Wl,--export-all-symbols,--out-implib,libhost.a