无法使用wx和STL创建共享库,“多重定义”错误?

时间:2013-06-22 13:35:09

标签: stl wxwidgets

我尝试使用wx和STL构建共享库,并在“多重定义”错误中失败。请参阅:

在源中找不到 wxPointListNode 的声明。可疑的行是这样的:

include/mathplot.h:85:WX_DECLARE_LIST(wxPoint, PointList);
include/mathplot.h:87:WX_DEFINE_LIST(PointList);
include/gpLineLayer.h:16:typedef std::deque<mpPointLayer*> mpPointList_t;

问题是什么?

2 个答案:

答案 0 :(得分:2)

没有实际代码,这只是猜测,但我怀疑

include/mathplot.h:87:WX_DEFINE_LIST(PointList);

生成PointList的完整定义,包括非模板化方法wxPointListNode :: DeleteData。 mathplot.h包含在所有.cpp文件中(gpPanel.cpp,gpSeries.cpp和baseData.cpp)。每个cpp文件都被编译成.o文件,因此每个文件都有自己的DeleteData定义,当你尝试将.o文件链接到lib / libgpPanel.so时,链接器会发出你报告的错误。

该方法的定义需要在其自己的cpp文件中编译和链接。

答案 1 :(得分:1)

所有名称中带有DEFINE的wxWidgets方法都会扩展为某个内容的定义,并且定义只能在模块中使用一次,因此它通常不会出现在头文件中(除非您可以保证它只包含在一个源文件中)。所以不要把它放在那里。

此外,如果这是您的代码,则应该完全避免使用旧版WX_DECLARE_LIST宏,而只需使用std::list<>std::vector<>。或者,如果您真的只想使用wx(只有在没有良好的STL实现的情况下针对某些嵌入式平台时才有用),请使用wxVector<>