在Qt中在c++中添加C函数时的构建问题
build issue when adding C function inside C++ in Qt
我正在构建一个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
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 在使用 GCC 4.8.5 构建的应用中对 cxx11 函数的未定义引用
- 有没有一种方法可以在linux中扫描已构建的ARM库中的函数
- 从函数的可变参数构建特定元组
- pair的两个构造函数几乎相同,为什么不生成构建错误?
- 仅在函数内部构建对象时EXC_BAD_ACCESS
- C++运行时构建嵌套函数
- 2个模板构造函数的组合构建与变异模板.如何
- 如何在类/类型中添加更多函数来构建 int、double、std::string 等
- 在函数呼叫时,请从异质初始化列表中构建元组
- 为链接列表构建迭代器类(错误:无匹配的构造函数以初始化)
- MATLAB S函数构建器如何将编译器更改为G
- 使用子字符串构造函数构建字符串 - 调试 - 当自动跳过代码时
- C++11:从模板函数构建 std::tuple
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc
- 模板类中向量向量的迭代函数构建
- 使用可重写的处理程序函数构建类层次结构
- 用vc++函数构建DLL是不可访问的
- 递归函数构建一个向量,会返回什么