[-]
Теги
linker c d ld dlang

Разработка на D: вызов функций из куска программы на C (вариация биндинга)
#1
Компилятор D позволяет линковать итоговый бинарник с практически любым .o файлом. Таким образом, можно написать часть приложения на C (например, если не нашлось подходящего модуля для D). По сути, получается что-то вроде написания заголовочного файла, но без необходимости компилировать отдельно в .a/so/dll/etc.

Данный пример - всего лишь 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.
#2
Ну, это называется "биндинг" или как это по русски - "связывание". Штука нужная, особенно для подобных языков, на самом деле. С учетом того, что это позволяет, в общем, использовать готовые библиотеки на C, которых великое множество, это может упростить жизнь в некоторых случаях.

Перейти к форуму:

Пользователи, просматривающие эту тему: 1 Гость(ей)