如何在 Lazarus (freepascal) 中使用 C++ 生成的 .dll 或 .lib 文件中定义的函数?
我想使用 'ANN' 库(近似最近邻)中的函数我的拉撒路代码。该应用程序是用 C++ 编写的,并附带源代码。如何从 Lazarus/FreePascal 中访问这些功能?
编辑:Lazarus/FPC 与 Delphi 类似。
I want to use functions from the 'ANN' library (Approximate Nearest Neighbor) in my Lazarus code. This application is written in C++, and comes with source code. How can I access the functions from within Lazarus/FreePascal?
Edit: Lazarus/FPC is similar to Delphi.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这取决于图书馆。如果它是 C++ 的“C”子集,或者接口经过专门设计以实现互操作,请参阅 opc0de 的答案。表明这种情况的一个重要信号是“extern C {}”块。
如果库是true C++,那么就有问题了。 C++ 没有通用的导出机制,甚至两个不同的 C++ 编译器通常也无法相互理解。
要使用它,您必须创建一个所谓的包装器。使用 /same/ C++ 编译器编译的一段代码,包装所有 C++ 特定内容,并且仅导出纯 C 函数 (extern C{})
作为示例,请查看所谓的 QTPAS 包装器,它包装 QT 以在 Free 中使用帕斯卡/德尔福。
It depends on the library. If it is the "C" subset of C++, or if the interface is specially crafted to be interoperable, see opc0de's answer. An important signal that this is the case is an "extern C {}" block.
If the library is true C++, you have a problem. There is no universal exporting mechanism for C++, and even two different C++ compilers generally don't understand eachother.
To use it, you must create a so called wrapper. A piece of code compiled with the /same/ C++ compiler that wraps everything C++ specific and only exports plain C functions (extern C{})
As an example, have a look at the so called QTPAS wrapper, that wraps QT for use in Free Pascal/Delphi.
如果你想从 dll 导入一个函数,你可以这样做
如果是一个 c++ 库,使用 cdecl 如果是一个 windows 库,使用 stdcall
这些代表参数传递约定
If you want to import a function from a dll you can do this
If is a c++ library use cdecl if is a windows library use stdcall
These represent the parameter passing conventions