【发布时间】:2011-05-17 12:56:07
【问题描述】:
我正在尝试找到一种在 D 中使用 C++ 类的方法。
http://www.digitalmars.com/d/2.0/cpp_interface.html
D 不能调用 C++ 特殊成员函数,反之亦然。这些包括构造函数、析构函数、转换运算符、运算符重载和分配器。
所以,我试图将这些 C++ 函数简化为 C 风格的函数调用。这是我正在使用的证据。
helper.h
class someClass {
public:
someClass();
char *whatSayYou();
};
extern "C"
{
someClass *hearMeOut();
}
helper.cpp
#include "helper.h"
someClass::someClass()
{
}
char *someClass::whatSayYou()
{
return "Everything is gravy";
}
someClass *hearMeOut()
{
return new someClass;
}
main.d
import std.stdio;
int main(string[] args)
{
someClass *awesomeExample = hearMeOut();
char *shoutoutToTheWorld = awesomeExample.whatSayYou();
writefln(std.string.toString(shoutoutToTheWorld));
return 0;
}
extern (C++)
{
interface someClass
{
char *whatSayYou();
}
someClass *hearMeOut();
}
这就是我的遵守方式。
g++-4.3 -c -I code/dg3d_helper -I /usr/local/include/ -o code/dg3d_helper/helper.o code/dg3d_helper/helper.cpp
code/dg3d_helper/helper.cpp: In member function ‘char* someClass::whatSayYou()’:
code/dg3d_helper/helper.cpp:19: warning: deprecated conversion from string constant to ‘char*’
gdc-4.3 -g -c -I code/ -o code/main.o code/main.d
gdc-4.3 -g -I code/ -o main code/dg3d_helper/helper.o code/main.o -lstdc++
一旦调用该方法,我就会遇到分段错误。
Program received signal SIGSEGV, Segmentation fault.
0x0000000000402fa0 in _Dmain (args=...) at code/main.d:7
7 char *shoutoutToTheWorld = awesomeExample.whatSayYou();
(gdb) bt
#0 0x0000000000402fa0 in _Dmain (args=...) at code/main.d:7
#1 0x000000000041b1aa in _D9dgccmain211_d_run_mainUiPPaPUAAaZiZi2goMFZv ()
#2 0x000000000041b235 in _d_run_main ()
#3 0x00002aaaab8cfc4d in __libc_start_main () from /lib/libc.so.6
#4 0x0000000000402d59 in _start ()
【问题讨论】:
-
GDB 会与 D 一起使用吗?至少[或类似的东西]会告诉你从哪里开始寻找。调试器 FTW
-
您还可以从 SVN 构建最新的 SWIG 并使用它(由于 klickverbot 的工作,它支持 D)。我正在尝试自己学习使用它来包装 Irrlicht(在我的业余时间)。
-
我对 gdb 中的所有选项感到非常不知所措。在这一点上我所知道的只是回溯。我不确定它还能做些什么来帮助我找出问题。
-
我得到了从 D 文档编译示例的分段错误。我认为您在这里有一个编译器错误。最好举报。
-
另外,关于 GDB,请尝试使用 print variableName
标签: c++ class segmentation-fault d