c++ - 如何正确从 D 接口(interface)到 C++?

标签 c++ gcc d dmd interfacing

我尝试在 C++ 和 D 之间建立接口(interface)。

问题是我无法编译它。我使用了网站上的代码/命令行

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

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

这就是我现在抛出“符号未找到”错误的地方,我不知道如何解决这个问题,我在编译时做错了什么吗?还是在编程网站上?

这里是我的编译命令:

PS C:\Users\kunde\Downloads\d-interface test> g++ -c -o test-cpp.obj test.cpp
PS C:\Users\kunde\Downloads\d-interface test> dmd -L"G:\GNUstep\lib\gcc\mingw32\4.6.1\libstdc++.dll.a" -L"G:\GNUstep\lib\gcc\mingw32\4.6.1\libstdc++.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

和我的代码: 测试.d:

import std.stdio;

extern (C++) char foo(int i);

void main(string[] args)
{
    writefln("%c", foo(14));
}

测试.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;
}

我做错了什么?

P.s.:我是德国人,所以错误可能需要翻译

编辑:正如答案中所述,MSVC 解决了问题,我将“g++ -c -o test-cpp.obj test.cpp”更改为“cl test.cpp -c/EHsc”

最佳答案

C++ 是一个挑剔的野兽 - 它的名称修改细节是实现定义的,因此它因平台和编译器而异。 dmd 选择一个它认为是系统上的主编译器并复制它。在 Linux 上,它是 g++...但在 Windows 上,它是 Microsoft C++,而不是 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...,要么最好使用接口(interface) extern(C) 来代替。 C 接口(interface)在事物之间的兼容性要好得多。

.o 与 .obj 的情况是一样的 - gcc 使用 .o,dmd 和 msvc 使用 .obj(至少 -m64 位构建匹配,32 位更复杂,具体取决于版本号)...所以真正使用相同的编译器系列将为您带来最佳结果。

关于c++ - 如何正确从 D 接口(interface)到 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72407064/

相关文章:

c++ - 在 gcc 5.1.0 中注册一个 GIMPLE pass

编码标准 : variable initialization

serialization - 我需要一个 D 的序列化框架

c++ - 防止为非常量对象调用 const 函数

c++ - 我的程序在进入 main() 函数之前退出

c++ - 在我的 C++ OpenFrameworks 项目中未定义对 wpa_ctrl 函数的引用。需要帮助集成这个 c 库

c++ - 强制使用预定义宏的 gcc 标志

range - 如何在 D 中实现范围

iterator - D 的类似 Boost.Filesystem 的库

c++ - 使用 switch 语句的函数没有返回