Thread overview
Trying to call some C code using Extern(C) but got unexpected linker error
Jun 08
Basile B.
June 08

Hi, I am new to D and is experimenting with game development using D and C.

I had some problem when trying to recreate the
https://dlang.org/spec/importc.html

Environment:
Windows 11
gcc.exe (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0

Error Message:

lld-link: error: undefined symbol: _D4test4mainFZ12printMessageUZv
>>> referenced by test.obj:(_Dmain)

// .c file
#include <stdio.h>

void printMessage() {
    printf("Hello from C!\n");
}
// .d file
import std.stdio;
import std.conv;
import test;

void main() {

    writeln("Hello, World!");
    extern (C) void printMessage();
    printMessage();
}

Thanks in advance!

June 08

On Saturday, 8 June 2024 at 02:22:00 UTC, Xiaochao Yan wrote:

>

Hi, I am new to D and is experimenting with game development using D and C.

I had some problem when trying to recreate the
https://dlang.org/spec/importc.html

Environment:
Windows 11
gcc.exe (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0

Error Message:

lld-link: error: undefined symbol: _D4test4mainFZ12printMessageUZv
>>> referenced by test.obj:(_Dmain)

// .c file
#include <stdio.h>

void printMessage() {
    printf("Hello from C!\n");
}
// .d file
import std.stdio;
import std.conv;
import test;

void main() {

    writeln("Hello, World!");
    extern (C) void printMessage();
    printMessage();
}

Thanks in advance!

Put printMessage outside the main function. Inside the main function, it has C linkage, but not C name mangling.

-Steve

June 08

On Saturday, 8 June 2024 at 02:22:00 UTC, Xiaochao Yan wrote:

>

Hi, I am new to D and is experimenting with game development using D and C.

I had some problem when trying to recreate the
https://dlang.org/spec/importc.html

[...]

Thanks in advance!

on a recent compiler this should work:

// .d file
import std.stdio;
import std.conv;
import test;

void main() {
    writeln("Hello, World!");

    pragma(mangle, "printMessage");
    extern (C) void printMessage();

    printMessage();
}

This was fixed by the dear GH Ghost in https://github.com/dlang/dmd/pull/15582.
A short technical explanation: mangling and call conventions are not 100% related.
You need to stuff the mangle for that to work.