在Qt中在c++中添加C函数时的构建问题

build issue when adding C function inside C++ in Qt

本文关键字:函数 构建 问题 添加 Qt 中在 c++      更新时间:2023-10-16

我正在构建一个Qt/c++应用程序。这个应用程序必须通过MTP连接到android设备。在mtp复制期间,我必须为mtp API提供一个C回调(仅限C)

我在下面声明了这个回调:

DeviceMngr.cpp

int fileprogress(const uint64_t sent, const uint64_t total, void const * const data) {
    int percent = (sent * 100) / total;
    if (Transfer_Cancelled == true)
        return 1;
    return 0;
}

DeviceMngr.h

extern  bool Transfer_Cancelled;
extern "C" {    
int fileprogress(const uint64_t sent, const uint64_t total, void const * const data);
}

它在下面的方法中被调用:

uint32_t DeviceMngr::CreateFile(QString filename, uint32_t parent_id) {
...
    ret = LIBMTP_Send_File_From_File(Device->device, strdup(AbsolutePath), genfile, fileprogress, NULL);
...

Transfer_Cancelled被使用了:

void DeviceMngr::CancelTransfer() {
    Transfer_Cancelled = true;
}

DeviceMngr::DeviceMngr()
{
    ...
    Transfer_Cancelled = false;
}

并且在方法实例化中确保init为false

问题是:

Undefined symbols for architecture x86_64:
  "_Transfer_Cancelled", referenced from:
      DeviceMngr::DeviceMngr() in devicemngr.o
      DeviceMngr::CreateFile(QString, unsigned int) in devicemngr.o
      _fileprogress in devicemngr.o
      DeviceMngr::CancelTransfer() in devicemngr.o
ld: symbol(s) not found for architecture x86_64

TransferCancel只定义DeviceMngr.c和其他任何地方。

这与函数无关,问题在于变量Transfer_Cancelled。这是一个问题,因为您在头文件中定义了,并且由于您在头文件中定义了它,它将在包含头文件的所有源文件(翻译单元)中定义。

你应该只在头文件中声明变量,例如:

extern bool Transfer_Cancelled;

添加ifndef以避免多个包含

#ifndef FOO_H                                                
#define FOO_H
extern "C" {
    bool Transfer_Cancelled;
    int fileprogress(const uint64_t sent, const uint64_t total, void const * const data);
}  
#endif