Компилятор D позволяет линковать итоговый бинарник с практически любым .o файлом. Таким образом, можно написать часть приложения на C (например, если не нашлось подходящего модуля для D). По сути, получается что-то вроде написания заголовочного файла, но без необходимости компилировать отдельно в .a/so/dll/etc.
Данный пример - всего лишь Hello World, но его вполне достаточно, чтобы продемонстрировать эту возможность. Работоспособность проверена в Linux, в других системах я не проверял.
Файл source/test_c.c:
Файл source/app.d:
Через extern © объявлена функция из файла test_c.c.
Теперь dub.json. То, благодаря чему это работает.
Первая опция компилирует test_c без вызова линкера. Вторая опция линкует файл с итоговым бинарником.
Проверяем:
Таким образом можно взаимодействовать с различными штуками через C.
Данный пример - всего лишь Hello World, но его вполне достаточно, чтобы продемонстрировать эту возможность. Работоспособность проверена в Linux, в других системах я не проверял.
Файл source/test_c.c:
Код:
#include <stdio.h>
void CTestFunction(char* charvar)
{
printf("%s\n", charvar);
}
Файл source/app.d:
Код:
import std.stdio;
extern (C) void CTestFunction(char* charvar);
void main()
{
CTestFunction(cast(char*)("Hello, World!"));
}
Через extern © объявлена функция из файла test_c.c.
Теперь dub.json. То, благодаря чему это работает.
Код:
"preBuildCommands": ["cc -c $PACKAGE_DIR/source/test_c.c -o $PACKAGE_DIR/source/test_c.o"],
"lflags": ["$PACKAGE_DIR/source/test_c.o"]
Первая опция компилирует test_c без вызова линкера. Вторая опция линкует файл с итоговым бинарником.
Проверяем:
Код:
(ldc2-1.29.0-linux-x86_64)user@desktop ~/d/c_linker_test> ./c_linker_test
Hello, World!
Таким образом можно взаимодействовать с различными штуками через C.
It's time to kick gum and chew ass. And i'm all out of ass.