这些类型的错误在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 )
{
}
在我的代码中,我以多态方式在IBKFileReader对象上调用readFile函数 而且,这部分没问题,没有任何错误,它编译,链接和运行。
但是,当我将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> >)" (?readFile@XYZFileReader@@UEAAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$shared_ptr@V?$PointCloud@UPointXYZ@pcl@@@pcl@@@boost@@@Z)
编辑: 我可能会引起一些误解。 FileReader.h和FileReader.cpp位于静态库项目中。我没有做的只是在cpp文件中实现该功能,定义等仍然存在。 在同一个解决方案中,我在另一个项目中引用了这个项目。
编译静态库时,我没有收到链接器错误,但是当我使用它时。 对不起,我的英语不好。
答案 0 :(得分: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) {}