非内联函数体中未解析的外部符号

时间:2014-03-05 12:38:59

标签: c++ static-libraries

这些类型的错误在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文件中实现该功能,定义等仍然存在。 在同一个解决方案中,我在另一个项目中引用了这个项目。

编译静态库时,我没有收到链接器错误,但是当我使用它时。 对不起,我的英语不好。

1 个答案:

答案 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) {}