這些類型的錯誤在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文件中實現函數,定義等仍然存在。 在同一個解決方案中,我在另一個項目中引用了這個項目。
編譯靜態庫時,我沒有收到鏈接器錯誤,但是當我使用它時。 對不起,我的英語不好。
請貼上錯誤本身 - 它與您在問題中提到的其他所有內容一樣重要。 – mockinterface
我想你不會**鏈接**將編譯後的.cpp文件中的對象文件與您的程序的其餘部分(假設您正在編譯說 - cpp文件,此時仍然是未知在我們這邊)。發佈項目的鏈接線(即Makefile的最終鏈接線)可能會確認/壓制此項。 – WhozCraig
@WhozCraig庫項目的編譯後輸出是.lib文件,並將其添加到我的第二個項目的鏈接器輸入設置中。我不能明白你的意思是「用你的程序的其餘部分移動該功能」。我只是在庫項目的.cpp文件中實現該功能。 – bahti