mingw / ar在输出库中为同一函数生成t和T符号

时间:2019-07-25 17:48:59

标签: c++ mingw32 ar

简介

在Linux中编译。我正在尝试在mingw32中生成一个.dll:让我们将其称为parent.dll。我在子库中定义的函数“ simpleFunction”遇到麻烦:让我们称之为libchild.a。我想在dll中导出此功能。生成dll时,我在libchild.a上收到“多个定义”错误:

./ libchild.a(child.o):在函数simpleFunction@8': (some path)/child.cc:52: multiple definition of simpleFunction @ 8'

背景

我以前使用DLL导出符号“ -DBUILDING_DLL -DBUILDING_PARENT_DLL” IAW编译和存档libchild.a,这种模式对于DLL非常常见。

#if ! defined (BUILDING_DLL)
#define PARENT_DLL
#else
#ifdef BUILDING_PARENT_DLL
#define PARENT_DLL __declspec(dllexport)
#else
#define PARENT_DLL __declspec(dllimport)
#endif
#endif

这是libchild.a的linux make命令:

i686-w64-mingw32-g++ -DWIN32 -MMD -MP -Wall -g -DBUILDING_DLL -DBUILDING_PARENT_DLL (-I statements removed for brevity) -std=c++98 -c -o obj/child.o child.cc

...,然后使用i686-w64-mingw32-ar将child.o收集到libchild.a中[AR定义为i686-w64-mingw32-ar,而child.o位于$(OBJDIR)中]:

$(AR) crs $@ $(OBJDIR)/*.o

这时,我有了libchild.a连续的child.o和其他不相关的目标文件。


这是make规则,它是parent.dll的输出命令(LD_LIBS是指其他不相关的静态库):

$(CXX) $(LDFLAGS) -Wl,--whole-archive -lchild -static $(LD_LIBS) -Wl,--no-whole-archive -lgdi32 -lws2_32 -Wl,--out-implib,libparent.a,--output-def,libparent.def -shared -o $@
i686-w64-mingw32-g++ (LDFLAGS is a bunch of '-L' statements: removed for brevity) -Wl,--whole-archive -dynamic -lchild -static (LD_LIBS removed for brevity) -Wl,--no-whole-archive -lgdi32 -lws2_32 -Wl,--out-implib,libparent.a,--output-def,libparent.def -shared -o libparent.dll

我认为我不需要上面的“ -dynamic”语句(两种方式的响应相同)。但是当我运行make时,出现以下错误:

./libchild.a(child.o): In function `simpleFunction@8':
(some path)/child.cc:52: multiple definition of `simpleFunction@8'

child.cc使用传统方法将simpleFunction定义为C函数。

...最后是libchild.a的符号转储:

$ i686-w64-mingw32-nm -C (another path)/libchild.a | grep -s simpleFunction
000000d9 t _GLOBAL__sub_I_simpleFunction_8
00000000 T simpleFunction@8

好的,simpleFunction被定义为't'和'T'。我不知如何处理此错误。任何建议表示赞赏。当然,我可能会从一个错误的问题开始……

干杯,谢谢!

0 个答案:

没有答案