2013-06-22 52 views
1

我試圖用wx和STL構建一個共享庫,並且在「多重定義」的錯誤中失敗。請參考:無法使用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; 

問題是什麼?

回答

1

所有wxWidgets的方法,在他們的名字DEFINE業務拓展到一些定義和定義只能在使用一次一個模塊,所以它通常不能出現在頭文件中(除非你可以保證它只包含一個源文件)。所以不要把它放在那裏。此外,如果這是你的代碼,你應該避免使用傳統的WX_DECLARE_LIST宏,只需要使用std::list<>std::vector<>來代替。或者,如果您真的只想使用wx(如果您的目標是一些沒有良好STL實現的嵌入式平臺,這隻能是非常重要的),那麼請使用wxVector<>

+0

我將DEFINE行從標題移動到源代碼,問題解決了。謝謝! – Vivodo

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