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

时间:2015-05-28 07:07:11

标签: c++ c qt callback

我正在构建一个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和任何其他地方。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

你应该只通过例如声明头文件中的变量。

extern bool Transfer_Cancelled;

答案 1 :(得分:0)

添加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