第 1 步。我有一个用于导出一些符号的可执行文件 ( main.exe ) 的导入库文件 ( main.lib )。使用 extern "C" 导出的那些符号。
第 2 步。我还有一个源文件 ( extra.cpp ),它导出了一些额外的功能。我从中生成了一个静态链接库(extra.lib),并将main.lib包含在其中,因为这些额外功能是main.exe导出的用户。
步骤 3.构建了一个与该库 ( extra.lib ) 链接的 dll ( bbb.dll ),以从main.exe调用这些额外的函数。(请注意,bbb.dll首先由main.exe加载和使用。)
现在我尝试使用 Mingw(gcc) 而不是 MS Visual Studio(cl) 重复步骤 2 和 3。我们称之为步骤 2x 和 3x。由于 main.exe 是一个包含许多文件的大项目......从源代码构建libmain.a不是一个好的选择,我在这里发现main.lib可以使用以下命令转换为 .a 文件:
reimp -d main.lib
dlltool -k -d main.def -l libmain.a
# reimp creates the .def file.
# dlltool uses the .def to create the .a that is linked in to the app.
步骤 2x。
gcc -c -o extra.o -O1 -s -x c++ extra.cpp
ar rs libextra.a extra.o
ar rs libextra.a libmain.a
步骤 3x。
g++ -O2 -o bbb.dll -shared -x c++ bbb.cpp -static-libgcc -static-libstdc++ -Wl,-s -Wl,--kill-at,--export-all-symbols,--enable-stdcall-fixup -Wl,--large-address-aware -lextra
我在第 3 步时遇到链接器错误。
libmain.a(lextra.o):extra.cpp:(.text+0x38): undefined reference to `A_Function_In_main'
这是一个名称修饰差异问题吗?
或者甚至可以以这种方式使用 gcc构建bbb.dll吗?
我做错了什么?
我在 Windows 7 上使用 Visual Studio 2012。MinGW 和 gcc 4.6.1。
检查“A_Function_In_main”是否在 libmain.a 中:
nm libmain.a > libmain_dump.txt
libmain_dump.txt 中关于“A_Function_In_main”的文本块
dshms00350.o:
00000000 b .bss
00000000 d .data
00000000 i .idata$4
00000000 i .idata$5
00000000 i .idata$6
00000000 i .idata$7
00000000 t .text
00000000 T A_Function_In_main
00000000 I __imp_A_Function_In_main
U _head_libmain_a