2014-03-05 60 views
0

這些類型的錯誤在SO和其他許多地方都有很好的討論,但是我無法找到解決方案來解決特定情況。非內聯函數體上的未解析的外部符號

基本上,我在我的解決方案中做了一個靜態庫項目來分離一些功能,並在當前項目中引用它。當我嘗試從庫中調用一個函數時,我得到了這個臭名昭着的鏈接器錯誤。我認爲在設置項目(引用,依賴關係等)方面沒有問題。

首先,我會給我所工作的一些小例子,(有一些第三方類)

//FileReader.h 
    class IBKFileReader{ 

    public: 
     virtual ~IBKFileReader() {} ; 
     virtual void readFile(std::string fileName, pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud) = 0 ; 

    }; 

    class XYZFileReader : public IBKFileReader 
    { 
    public: 
     virtual void readFile(std::string fileName, pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud) 
     { 
     } 

而且在我的代碼,我多態調用READFILE功能的IBKFileReader對象。
而且,這部分沒有問題,它編譯,鏈接和運行。

但是,當我將readFile函數的主體移動到一個.cpp文件並在其中執行時(其中有相同的簽名,希望我複製粘貼),我得到了未解析的外部符號錯誤。這是.cpp文件中函數的標題。

void XYZFileReader::readFile(std::string fileName, pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud) 

看來,實現函數體內聯在頭文件中,並在一些單獨的文件中實現有所作爲。

您對這個問題有什麼看法?有沒有人遇到類似的東西?我希望我不會錯過某些明顯的東西。

編輯: 這是錯誤日誌中我得到:

1>main.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl XYZFileReader::readFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class boost::shared_ptr<class pcl::PointCloud<struct pcl::PointXYZ> >)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@[email protected]@@Z) 

編輯: 我可能已經造成了一些誤解。 FileReader.h和FileReader.cpp位於靜態庫項目中。我沒有做更多的事情,只是在cpp文件中實現函數,定義等仍然存在。 在同一個解決方案中,我在另一個項目中引用了這個項目。

編譯靜態庫時,我沒有收到鏈接器錯誤,但是當我使用它時。 對不起,我的英語不好。

+2

請貼上錯誤本身 - 它與您在問題中提到的其他所有內容一樣重要。 – mockinterface

+3

我想你不會**鏈接**將編譯後的.cpp文件中的對象文件與您的程序的其餘部分(假設您正在編譯說 - cpp文件,此時仍然是未知在我們這邊)。發佈項目的鏈接線(即Makefile的最終鏈接線)可能會確認/壓制此項。 – WhozCraig

+0

@WhozCraig庫項目的編譯後輸出是.lib文件,並將其添加到我的第二個項目的鏈接器輸入設置中。我不能明白你的意思是「用你的程序的其餘部分移動該功能」。我只是在庫項目的.cpp文件中實現該功能。 – bahti

回答

0

在其類成員列表中定義的成員函數稱爲內聯成員函數。嘗試將成員定義移出類定義。

class XYZFileReader : public IBKFileReader 
{ 
public: 
    virtual void readFile(std::string fileName, 
          pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud); 
}; 

void XYZFileReader::readFile(std::string fileName, 
          pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud) {} 
+0

是的,其實我的問題是這樣的。內聯定義函數是可以的,但是當我從類中定義函數時,我得到了鏈接器錯誤。 – bahti