我有一个我使用的课程,我试图重写它,所以它使用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
个扩展名。)
答案 0 :(得分:2)
你的ar命令
ar -rsv lib/libdata.a
应该是
ar -rsv lib/libdata.a *.o
否则您创建了一个空档案。顺便说一下,你应该熟悉显示符号的linux命令'nm'。