Search code examples
stlwxwidgets

Failed to create shared library with wx and STL, "multiple definition" error?


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?


Solution

  • All wxWidgets methods with DEFINE in their name expand into a definition of something and a definition can only be used once in a module, so it typically can't appear in a header file (unless you can guarantee that it's included by only a single source file). So just don't put it there.

    Moreover, if this is your code, you should avoid using the legacy WX_DECLARE_LIST macro at all and just use std::list<> or std::vector<> instead. Or, if you really want to use only wx (which can only be important if you are targeting some embedded platform without good STL implementation), then use wxVector<>.