2009-12-29 225 views
0

矢量僅包含在一個源文件中。頭文件中唯一包含的字符串是字符串。但我無法擺脫多個定義錯誤(下面的例子)。有任何想法嗎?矢量多重定義鏈接錯誤

./plugin_dfb.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182:`的的std ::操作符 - 多個定義(STD :: _ Bit_iterator_base常量&,STD :: _ Bit_iterator_base常量&)」 ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182:首先這裏定義

+0

所有的頭文件使用「曾經的#pragma」的#pragma – 2009-12-29 19:12:51

回答

0

你試圖使用#pragma once

+1

一次將*不*解決了鏈接錯誤 – sellibitze 2009-12-29 15:56:30

0

我認爲你只在一個頭文件中包含了這個向量,但是這個頭文件沒有#define塊,這導致了包含在其中的向量頭文件的重定義。 請將您的包含文件放在下面給出的模板中,然後嘗試。

#if !defined(HEADER_FILE) 
#define HEADER_FILE 
// Your code 
#endif 
+7

通常它更像'的#ifndef HEADER_FILE_H','#定義HEADER_FILE_H'和'在C#endif'/C++ – 2009-12-29 11:17:11

0

由於問題在鏈接期間出現,它看起來與模板實例化有關。鑑於實例化實現細節,應該將模板函數/定義放在通用包含文件中,以確保它們在任何地方都可見,並且不會重複頭部包含可能出現的情況。

從你發佈的問題涉及到的運算符 - 可以使用std :: distance(),它可以從find()函數中調用。因此,看看你是否定義或調用了這些函數,因爲它們可能與向量和字符串一起工作,並確保它們在共享的頭文件中。

1

這個std :: operator-是一個帶有外部鏈接的內聯函數。看起來鏈接器不支持這種內聯函數的多重定義。但是C++(ODR)的「一個定義規則」明確地允許這樣做。通常,這些符號會得到「弱連接」(GNU術語),但我認爲目標文件格式和連接器都需要支持這一點。

我會嘗試在專用於您的平臺的組/郵件列表中提問。 「平臺X支持C++關於鏈接和C++相關的內聯函數和模板的單一定義規則是否符合」。

您可能還想檢查GCC文檔。他們可能會提供一個命令行開關作爲解決方法。如果你還沒有使用g ++作爲鏈接器的前端,你應該嘗試一下。也許這也有幫助。