在Qt framework内链接C++中的C文件时出现未定义的引用[duplicate]

wtlkbnrh  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(219)

此问题在此处已有答案

QT No such file or dictionary when I try to include a header file(2个答案)
去年关闭了。

简介:

我在Qt框架中有一个C++项目,最近我用纯C99代码创建了一个CAN-bus SAE J1939 library。这个库运行得非常好。现在我将把这个库导入到我的Qt Creator Qt项目中。

  • 注意 *:编译器为MinGW 5.15.2
    方法:

我已经通过在我的 .pro 项目文件中包含行,在带有Qt框架的C++中包含了 .h 文件。

include(ThirdLibrary/OpenSAEJ1939/OpenSAEJ1939.pri)

OpenSAEJ1939.pri文件中,它被写入

INCLUDEPATH += $$PWD

下面是我的项目文件夹:

路径ThirdLibrary/OpenSAEJ1939/Open_SAE_J1939/

因此,当我创建一个C++源文件,然后添加C源函数时,我得到了 * 对Open_SAE_J1939_Listen_For_Messages* 的未定义引用。

#include "Can_Bus_Listen_Thread.h"

CAN_Bus_Listen_Thread::CAN_Bus_Listen_Thread(J1939* j1939, bool* usbMessageAvailable, bool* startCANBusListenThread){
    this->j1939 = j1939;
    this->usbMessageAvailable = usbMessageAvailable;
    this->startCANBusListenThread = startCANBusListenThread;
}

void CAN_Bus_Listen_Thread::run(){
    while(1){
        if(*this->startCANBusListenThread && *this->usbMessageAvailable)
            Open_SAE_J1939_Listen_For_Messages(this->j1939);
        msleep(1);
    }
}

我查看C++头文件 Can_Bus_Listen_Thread.h,可以看到我已经从 ThirdLibrary/OpenSAEJ 1939/Open_SAE_J1939/ 导入了C头文件。

#ifndef CAN_BUS_LISTEN_THREAD_H
#define CAN_BUS_LISTEN_THREAD_H

#include <QThread>
#include <QtSerialPort>
#include "ThirdLibrary/OpenSAEJ1939/Open_SAE_J1939/Open_SAE_J1939.h"

class CAN_Bus_Listen_Thread : public QThread {
public:
    CAN_Bus_Listen_Thread(J1939* j1939, bool* usbMessageAvailable, bool* startCANBusListenThread);
private:
    J1939* j1939;
    bool* startCANBusListenThread;
    bool* usbMessageAvailable;
    void run();
};

#endif // CAN_BUS_LISTEN_THREAD_H

我已经成功地包含了C头文件,但是这些头文件找不到C源文件。是的,Open_SAE_J1939_Listen_For_Messagesextern "C" { }包围在Open_SAE_J1939.h中。
我忘了什么吗?C++应该能够读取C源文件,如果它们周围有extern "C" { }

#ifndef OPEN_SAE_J1939_OPEN_SAE_J1939_H_
#define OPEN_SAE_J1939_OPEN_SAE_J1939_H_

/* Layers */
#include "../Open_SAE_J1939/Structs.h"
#include "../SAE_J1939/SAE_J1939-71_Application_Layer/Application_Layer.h"
#include "../SAE_J1939/SAE_J1939-73_Diagnostics_Layer/Diagnostics_Layer.h"
#include "../SAE_J1939/SAE_J1939-81_Network_Management_Layer/Network_Management_Layer.h"

#ifdef __cplusplus
extern "C" {
#endif

/* This functions must be called all the time, or be placed inside an interrupt listener */
void Open_SAE_J1939_Listen_For_Messages(J1939 *j1939);

#ifdef __cplusplus
}
#endif

#endif /* OPEN_SAE_J1939_OPEN_SAE_J1939_H_ */
juud5qan

juud5qan1#

这就是解决方案。
1.右键单击Qt中项目。
1.选择“添加现有词典”
1.标记您要导入的词典。现在您可以在.pro文件中看到许多.c.h文件。
提示:不要使用../../。这可能会导致问题。请改用项目路径,例如:

"ThirdLibrary/OpenSAEJ1939/...your_h_files.h"

您不需要.pri文件。请删除它。

相关问题