我有一个类,我使用它,我试图重写它,所以它使用pimpl成语作为练习。但是,我现在很难编译和链接这个程序。我有一个主文件夹,其中包含一个名为data的文件夹,其中声明了类Data的pimpl实现。此文件夹再次包含一个实现类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中,并具有.cc扩展)。
发布于 2016-10-11 16:18:14
您的ar命令
ar -rsv lib/libdata.a应该是
ar -rsv lib/libdata.a *.o否则,您将创建一个空的归档文件。顺便说一句,您应该熟悉linux命令'nm‘,它显示符号。
https://stackoverflow.com/questions/39980617
复制相似问题