无法使用 wx 和 STL 创建共享库,"multiple definition"错误?



我试图使用wx和STL构建一个共享库,但由于"的多重定义"错误而失败。请参阅:

  • https://code.google.com/p/gppanel/issues/detail?id=7

在源中找不到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;

问题出在哪里?

如果没有实际的代码,这只是一个猜测,但我怀疑

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文件中,该文件在.

中编译和链接

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

此外,如果这是您的代码,则应完全避免使用传统的WX_DECLARE_LIST宏,而只使用std::list<>std::vector<>。或者,如果你真的只想使用wx(只有当你的目标是一些没有良好STL实现的嵌入式平台时,这才是重要的),那么就使用wxVector<>

最新更新