如何从D正确地接口到c++ ?



我尝试在c++和d之间进行接口。

问题是我不能编译它。我在网站上使用了代码/命令行

> g++ -c foo.cpp
> dmd bar.d foo.o -L-lstdc++ && ./bar

,它没有工作:首先,DMD编译器不使用。o文件,所以我必须手动指定创建一个。obj文件,然后链接器抛出一个错误,因为它不知道/lstdc++,所以我手动配置了cpp库。

这就是我现在所在的位置它会抛出"Symbol not found"错误,我不知道如何解决这个问题,我在编译上做错了什么吗?还是在编程网站上?

下面是我的编译命令:
PS C:UserskundeDownloadsd-interface test> g++ -c -o test-cpp.obj test.cpp
PS C:UserskundeDownloadsd-interface test> dmd -L"G:GNUsteplibgccmingw324.6.1libstdc++.dll.a" -L"G:GNUsteplibgccmingw324.6.1libstdc++.a" .test-cpp.obj .test.d
test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""char __cdecl foo(int)" (?foo@@YADH@Z)" in Funktion "__Dmain".
test-cpp.exe : fatal error LNK1120: 1 nicht aufgelöste Externe
Error: linker exited with status 1120

和我的代码:test.d:

import std.stdio;
extern (C++) char foo(int i);
void main(string[] args)
{
writefln("%c", foo(14));
}

test.cpp:

#include <iostream>
extern "C" {
#include "test.h"
}
char foo(int i){
std::cout << "got: ";
return (char)bar(i);
}

和test.h:

#include <stdio.h>
int bar(int a){
printf("returned %d", a*a);
return a*a;
}

我做错了什么?

注。:我是德语,所以错误可能需要翻译

编辑:正如答案中所说,MSVC修复了这个问题,它改变了"g++ -c -o test-cpp。obj test.cpp"to "cl test.cpp -c/EHsc">

c++是一只挑剔的野兽——它的名称混淆细节是由实现定义的,因此它因平台和编译器而异。DMD选择一个它认为是系统上的主编译器并复制它。在Linux上,它是g++....但是在Windows上,它是microsoftc++,而不是g++。

所以你必须使用匹配的编译器。在Windows上,有gdc编译器——一个内置在gcc中的D编译器——但是目前还没有它的二进制版本。你必须自己编译一些配置标志…

../gcc/configure --prefix=/mingw64 --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --disable-bootstrap --disable-werror --disable-libssp --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libitm  --disable-libsanitizer --disable-libstdcxx-pch --with-arch=x86-64 --with-gnu-as --with-gnu-ld --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-languages=d --enable-libphobos --enable-shared --enable-static --disable-multilib

是我用的

这有点痛苦。我也从来没有在gdc/Windows上测试过extern(c++)。

所以我建议在c++上使用MSVC编译器和dmd....或者把接口改成extern(C)更好。C接口的兼容性要好得多。

和。o vs .obj的事情是相同的情况- gcc使用。o, dmd和msvc使用。obj(至少-m64位构建匹配,32位更复杂,取决于版本号)…所以真正使用相同的编译器家族将会得到最好的结果。

最新更新