ExLib 输出为动态库
hpp 文件
#ifndef EXTESTA_HPP
#define EXTESTA_HPP
#include "ExLib_global.hpp"
#include <QString>
class EXLIB_EXPORT ExTestA
{
public:
ExTestA();
void funcA();//声明却没有实现
QString name() const;
void setName(const QString &name);
private:
QString m_name;
};
#endif // EXTESTA_HPP
cpp 文件
#include "ExTestA.hpp"
ExTestA::ExTestA()
{
}
QString ExTestA::name() const
{
return m_name;
}
void ExTestA::setName(const QString &name)
{
m_name = name;
}
ExMain 输出为可执行文件
调用
ExTestA aaa;
aaa.setName("AAAA");
QMessageBox::information(this, "eee", aaa.name());
现象:
- 两个项目均可以正常生成
- 导出类 ExTestA 可以正常调用已经实现的方法
调用2
ExTestA aaa;
aaa.setName("AAAA");
aaa.funcA();//加上这句后,链接失败,找不到符号
QMessageBox::information(this, "eee", aaa.name());
编译错误提示
undefined reference to `__imp__ZN7ExTestA5funcAEv'
分析:
声明函数是没有任何操作的,只有在调用时才将地址替换到调用的地方,由于没有生成实现,替换时没有找到响应的地址,所以报错- (过些日子后)上述分析可行,编译单元每个单独编译(ExTestA.cpp, main.cpp),链接器在链接过程中会将符号(main.cpp 中的 aaa.funcA())替换为实际地址,由于没有定义,没有实际的地址,(符号表中)找不到报错