【发布时间】:2020-05-04 14:55:48
【问题描述】:
我是 ffi 的新手。但我成功地将 dart-ffi 与函数调用一起使用。
现在,我想在 dart ffi 中使用 C++ 对象。我不知道是否可能,但我尝试过这样。
构造函数调用的原型是:
function_dart = lib
.lookup<NativeFunction<function_native>>("constructor_function")
.asFunction();
但我有:
Failed to lookup symbol <constructor_function>,在那里我尝试了构造函数:
constructor_function
class::constructor_function
class::constructor_function(args)
我做了nm -gDC <lib>,我可以看到构造函数。
帮助!
编辑 1: @Botje,@Richard-Heap
我正在尝试使用 OpenCV 中的 VideoCapture 实例。
我已按照 Botje 的回答中的说明进行操作。
所以我创建了一个库,如下所示:
绑定.hpp:
#ifndef BIND_HPP
# define BIND_HPP
#include <opencv2/videoio.hpp>
extern "C" {
cv::VideoCapture *cvCreateVideoCapture(char *filename, int apiPreference);
}
#endif
绑定.cpp:
#include "bind.hpp"
cv::VideoCapture *createVideoCapture(char *filename, int apiPreference) {
return new cv::VideoCapture(filename, apiPreference);
}
我用来编译的命令:
g++ -c bind.cpp -lopencv -o bind.o
g++ bind.o -shared -o bind.so
我明白了:dart: symbol lookup error: ./lib/src/bind.so: undefined symbol: _ZN2cv12VideoCaptureC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi
下一步,是使用 VideoCapture 实例的方法。
谢谢
【问题讨论】:
-
C++ 没有程序员“调用构造函数”的概念(由于某些声明和强制转换语法的外观,我意识到有些人认为它确实如此),并且构造函数没有名称。对象是由更复杂的机器创建的,其中大部分都隐藏在语言的语义中,不能直接提供给您。你想完成什么?
-
我正在尝试将第 3 方库与 C++ 对象一起使用,但我不想重写它。更准确地说,我必须仅使用 C++ 对象构造函数打开文件格式。我可以编写一个接口,但不能自己重写对象。这似乎是一个矫枉过正的工作,只是为了可能性,我可能不知道。
-
-lopencv应该继续链接步骤 (gcc ... -o bind.so),而不是编译步骤。如果还有其他问题,请打开一个新问题,而不是污染这个问题。
标签: c++ flutter dart ffi dart-ffi