1

I tried to build a shared library using wx and STL, and failed in an error of "multiple definition of". Please refer to:

The declaration of wxPointListNode is not found in the sources. The suspicious lines are like these:

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;

What the problem is?

4

2 回答 2

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 文件中。

于 2013-06-22T21:58:06.670 回答
1

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

此外,如果这是您的代码,您应该完全避免使用旧版WX_DECLARE_LIST宏,而只使用std::list<>orstd::vector<>代替。或者,如果您真的只想使用 wx(如果您的目标是一些没有良好 STL 实现的嵌入式平台,这很重要),然后使用wxVector<>.

于 2013-06-22T22:29:46.860 回答