gpt4 book ai didi

c++ - 如何将带有 const 参数的 C++ 函数或 C++ 结构链接到 D 可执行文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:58 24 4
gpt4 key购买 nike

我正在尝试将 C++ 目标文件链接到 D 可执行文件。

dlang.org 建议这应该是可能的:http://dlang.org/cpp_interface.html

事实上,为我想链接到的 C++ 对象文件创建 D 接口(interface)文件非常简单。 C++ 模块的公开部分只是一组全局 C 风格函数和一些结构。

我想做的应该是这样的:

rdmd -main -unittest -L-lcurl -Lsvm.o "-L/usr/lib/libstdc++.a" svmWrapper.d

其中 svm.o 是 C++ 目标文件,而 svmWrapper.d 是构建为可执行文件的 d 文件(在本例中,只是一个将运行单元测试的文件)。

但是,对于在 D 文件中调用的 C++ 目标文件中的某些(但不是全部)函数,链接器会发出 undefined reference 错误。我怀疑这些问题是由 D 接口(interface)文件中的不正确声明引起的,但我不确定我哪里出错了。

例如 svm_cross_validation 函数。 .di 文件包含:

 extern(C++) void svm_cross_validation(const(svm_problem) *prob, const(svm_parameter) *param, int nr_fold, double *target);

我认为这等同于 C++ 头文件中的声明:

void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter* param, int nr_fold, double *target);

但这可能不太正确。我认为常量有问题,但不确定是什么。链接器说:

undefined reference to `svm_cross_validation(svm_problem const*, svm_parameter const*, int, double*)'

我假设其他投诉的发生是因为 D 想要来自不存在的结构的某些类型信息。这不是那么紧急,因为在最坏的情况下,我可以在 C++ 模块中隐藏有关这些结构的所有信息。但是,我不明白为什么不存在此信息。 .di 文件包含:

struct svm_node
{
int index;
double value;
}

我相信这等同于 C++ 头文件的

struct svm_node 
{
int index;
double value;
};

链接器产生了一些错误:

undefined reference to `_D3svm8svm_node6__initZ'
undefined reference to `_D3svm8svm_node11__xopEqualsFKxS3svm8svm_nodeKxS3svm8svm_nodeZb'

我已经验证只有在 D 文件中访问 svm_node 类型的内部变量时才会出现这些错误。仅仅实例化一个指向 svm_node 的指针是不够的。

无论如何,如果有人能解释我这里哪里出了问题,我将不胜感激。

最佳答案

您可能被未编译成必要代码的结构定义所困扰,因为您的文件名为 svm.di而不是 svm.d并且您正在使用 rdmd 进行编译这为您隐藏了大部分细节。

因为您在 svm.di 中有结构声明文件它必须得到编译。 .di文件有点像 .h C/C++ 的文件,但略有不同。为 rdmd 解决此问题的最快方法是重命名svm.disvm.dtouch *.d然后你的 rdmd 应该正确构建。

至于缺少的声明,您肯定看起来像是在 svm.di 中正确定义了它文件(您现在应该已将其重命名为 svm.d。您需要验证它是否存在于您通过运行 svm.osvm.cpp 文件生成的 nm svm.o | c++filt 文件中,这应该产生类似于(除其他外) ):

0000000000000010 T svm_cross_validation(svm_problem const*, svm_parameter const*, int, double*)

即你的.o文件包含 svm_cross_validation 的导出定义,与您在 svm.di 中声明的模式匹配文件。

我建议将 .cpp 文件的结果输出重命名为与 svm.d 相关的潜在命名不会重叠的内容。文件

I'd generally use a Makefile for the building because I'm mixing multiple languages and files together. I've built a very small github project showing a Makefile building the relevant code to ensure that, for example, the C++ code gets compiled when the .cpp file changes.

关于c++ - 如何将带有 const 参数的 C++ 函数或 C++ 结构链接到 D 可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com