Qt - LNK2019在类的成员函数中使用命名空间的功能时

时间:2017-04-19 15:05:20

标签: c++ qt

我在Project\test\compare_structs.h内有一个带有函数声明的命名空间:

#ifndef COMPARE_STRUCTS_H
#define COMPARE_STRUCTS_H

#include <QtTest/QtTest>
#include "include/Utils/containers.h"

namespace compare_structs {
    void compareRawData(RAW_DATA actual, RAW_DATA expected);
    ...
}

#endif // COMPARE_STRUCTS_H

我在Project\test\compare_structs.cpp中定义了函数:

#include "compare_structs.h"

void compare_structs::compareRawData(RAW_DATA actual, RAW_DATA expected)
{
    ...
}

我还将.h.cpp个文件添加到Qts .pro文件中:

test {
HEADERS +=  ...
            test/sql_db_test.h \
            test/compare_structs.h \

SOURCES +=  ...
            test/sql_db_test.cpp \
            test/compare_structs.cpp \
}

现在我#include compare_structs.h到了一个班级.h并在.cpp文件中调用它:

Project\test\sql_db_test.h

#ifndef SQL_DB_TEST_H
#define SQL_DB_TEST_H

...
#include "test/compare_structs.h"

class Sql_DB_Test : public QObject
{
    ...

private slots:
    ...
    void add_get_raw_data_test();
    ...
};

#endif // SQL_DB_TEST_H

Project\main\test\sql_db_test.cpp

#include "sql_db_test.h"

void Sql_DB_Test::add_get_raw_data_test()
{
    ...
    compare_structs::compareRawData(rawBack, raw); //LNK2019
}

错误消息:

sql_db_test.obj:-1: Fehler: LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl compare_structs::compareRawData(struct RAW_DATA,struct RAW_DATA)" (?compareRawData@compare_structs@@YAXURAW_DATA@@0@Z)" in Funktion ""private: void __thiscall Sql_DB_Test::add_get_raw_data_test(void)" (?add_get_raw_data_test@Sql_DB_Test@@AAEXXZ)".

免费翻译: unresolved externel symbol ""void __cdecl compare_structs::compareRawData(struct RAW_DATA,struct RAW_DATA)" (?compareRawData@compare_structs@@YAXURAW_DATA@@0@Z)" in function ""private: void __thiscall Sql_DB_Test::add_get_raw_data_test(void)" (?add_get_raw_data_test@Sql_DB_Test@@AAEXXZ)".

导致链接器错误的原因是什么?

1 个答案:

答案 0 :(得分:2)

这听起来与每次向Qt Project添加新文件时发生的情况完全相同。 Qt Creator对重建自己的makefile的需要感到困惑。

如果Qt Creator菜单中的“全部清除”后跟“全部重建”不起作用,则只需转到项目所在的父文件夹,然后删除对应的build-...文件夹到你的项目。

然后“全部清理”和“全部重建”。