dmd linker (OPTLINK) выдает ошибку 42: символ не определен при использовании extern - PullRequest
4 голосов
/ 26 декабря 2011

Связывание следующих двух файлов дает мне ошибку ссылки:

объявление:

import std.stdio;

extern string test ();

void main() {
    writeln(test());
    readln();
}

bd:

string test () {
    return "hello";
}

ошибка, которую я получаюэто:

Error 42: Symbol Undefined _D1a4testFZAya`

---errorlevel 1

Что не так?

__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

Редактировать: это правильный способ сделать это:

объявление:

import std.stdio;
import b;

void main() {
   writeln("some_var from Module b: \"", b.some_var, "\"");
}

бд:

public string some_var = "Hello, world!";

//you can also use static module constructors to set your vars
static this() {
   some_var ~= " -- How are you?";
}

Этот код был любезно предоставлен Джошуа Ройшем на отличном форуме D для начинающих на сайте digitalmars.com.

1 Ответ

4 голосов
/ 26 декабря 2011

Измените ваш a.d на:

import std.stdio;
import b;

//extern string test ();

void main() {
  writeln(test());
  readln();
}

extern является атрибутом связи и в основном используется для указания того, какое соглашение о вызовах использовать для данной функции (обычно это функция C в некоторой библиотеке). Подробнее о extern и других атрибутах здесь: http://www.d -programming-language.org / attribute.html . Если все, что у вас есть, это D исходные файлы, то в extern действительно нет необходимости. Однако, если вы смешиваете код на C или C ++ и D, вам определенно придется его использовать.

...