Qt项目实现CRC32时遭遇LNK2019链接错误求助
解决Qt项目中CRC32类的LNK2019链接错误
在Qt项目中实现CRC32校验和时,构建出现如下链接错误:
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl Crc32::Crc32(void)" (??0Crc32@@QEAA@XZ) referenced in function "private: void __cdecl MainWindow::on_pushButton_configfile_clicked(void)" (?on_pushButton_configfile_clicked@MainWindow@@AEAAXXZ)
相关代码如下:
CRC32.h 头文件
#ifndef CRC32_H #define CRC32_H #include <QtCore> #include <QString> #include <QMap> class Crc32 { private: quint32 crc_table[256]; QMap<int, quint32> instances; public: Crc32(); quint32 calculateFromFile(QString filename); void initInstance(int i); void pushData(int i, char *data, int len); quint32 releaseInstance(int i); }; #endif // CRC32_H
CRC32.cpp 实现文件
#include "crc32.h" #include <QFile> Crc32::Crc32() { quint32 crc; // initialize CRC table for (int i = 0; i < 256; i++) { crc = i; for (int j = 0; j < 8; j++) crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1; crc_table[i] = crc; } } quint32 Crc32::calculateFromFile(QString filename) { quint32 crc; QFile file; char buffer[16000]; int len, i; crc = 0xFFFFFFFFUL; file.setFileName(filename); if (file.open(QIODevice::ReadOnly)) { while (!file.atEnd()) { len = file.read(buffer, 16000); for (i = 0; i < len; i++) crc = crc_table[(crc ^ buffer[i]) & 0xFF] ^ (crc >> 8); } file.close(); } return crc ^ 0xFFFFFFFFUL; } void Crc32::initInstance(int i) { instances[i] = 0xFFFFFFFFUL; } void Crc32::pushData(int i, char *data, int len) { quint32 crc = instances[i]; if (crc) { for (int j = 0; j < len; j++) crc = crc_table[(crc ^ data[j]) & 0xFF] ^ (crc >> 8); instances[i] = crc; } } quint32 Crc32::releaseInstance(int i) { quint32 crc32 = instances[i]; if (crc32) { instances.remove(i); return crc32 ^ 0xFFFFFFFFUL; } else { return 0; } }
MainWindow中的调用代码
void MainWindow::on_pushButton_configfile_clicked() { QString txtfilename = "demoFES_1"; QString configFileName = QCoreApplication::applicationDirPath()+"/data/config_file/"+txtfilename+".txt"; Crc32 crc1; // crc32 instance qDebug()<<"CRC32 from file: "<<crc1.calculateFromFile(configFileName); }
错误根源分析
LNK2019错误表示链接器无法找到类成员函数的实现,常见原因如下:
- CRC32.cpp未被加入项目构建列表:Qt Creator不会自动识别手动添加的源文件,需要手动将其添加到项目的
.pro文件的SOURCES变量中,或者在Qt Creator的项目视图里右键选择「添加现有文件」将CRC32.cpp加入项目。 - 文件名大小写不匹配:虽然Windows文件系统不区分大小写,但Qt的构建系统可能因头文件与源文件的大小写不一致(例如头文件是
CRC32.h,源文件实际是crc32.cpp)导致链接器无法关联实现,需确保文件名大小写统一。 - 构建缓存或配置问题:切换Debug/Release模式后,新添加的文件可能未被同步到对应构建配置中;或者项目构建目录存在旧缓存,需要执行「清理项目」后重新构建。
- 编译器命名修饰冲突:如果项目中混合了C和C代码,且未正确使用
extern "C"修饰,但此场景下代码均为C类实现,该可能性极低。
内容的提问来源于stack exchange,提问作者teslat
相关产品推荐
相关产品推荐

