编译pimpl样式类定义并将其链接到库中(C ++)

时间:2016-10-11 15:12:08

标签: c++ class pimpl-idiom

我有一个我使用的课程,我试图重写它,所以它使用pimpl习语作为练习。但是,我现在无法尝试编译和链接程序。我有一个主文件夹,其中包含一个名为DateTime1: -1916-06-22 00:00:00 DateTime2: -1916-06-21 00:00:00 的文件夹,其中声明了类data的pimpl实现。此文件夹再次包含一个文件夹Data,其中实现了类dataimpl。树是

DataImpl

班级├── data │   ├── dataimpl │   ├── lib

命名
Data

我可以像这样创建一个可执行文件

#ifndef INCLUDED_DATA_
#define INCLUDED_DATA_

#include "dataimpl/dataimpl.h"

class Data
{
    DataImpl * pimpl; // Only internal variable

public:
    Data();
    bool read();
    void display() const;
};

#endif

它工作得很好。但是,我想首先在文件夹g++-6 main.cc data/*.cc data/dataimpl/*.cc -std=c++14 中为Data类创建一个库文件。为此,在文件夹data/lib中使用命令

data

然后我将g++-6 -c *.cc ar -rsv lib/libdata.a ranlib lib/libdata.a 的目标文件编译为

main.cc

现在我想通过链接为

将整个事物放在一起
g++-6 -c main.cc 

我收到错误消息

g++-6 -o exec main.o data/lib/libdata.a data/dataimpl/*.cc

我无法理解为什么main.o: In function `main': main.cc:(.text+0x26): undefined reference to `Data::Data()' main.cc:(.text+0x3a): undefined reference to `Data::read()' main.cc:(.text+0x7d): undefined reference to `Data::display() const' collect2: error: ld returned 1 exit status 函数给出未定义的引用,因为我在链接时将库文件添加到搜索路径。如果找不到Data函数,对我来说会有一些意义,但我也会将这些函数添加到搜索路径中(这些实现位于DataImpl并且有data/dataimpl个扩展名。)

1 个答案:

答案 0 :(得分:2)

你的ar命令

ar -rsv lib/libdata.a

应该是

ar -rsv lib/libdata.a *.o

否则您创建了一个空档案。顺便说一下,你应该熟悉显示符号的linux命令'nm'。