Я создаю плагин (модуль расширения) для интерпретатора языка, на котором пишу C.
Во время выполнения программа использует LoadLibrary
для загрузки указанного файла DLL. , Это похоже на работу с базовыми c DLL, которые не зависят от функций, определенных в основной программе.
Однако я пытаюсь создать подключаемый модуль DLL, который зависит от функций, определенных в двоичный файл основной программы.
Для этого я определил заголовок interface.h
в базе основного кода, чтобы эти плагины включались и использовались. Он определяет заголовки для функций, которые могут им потребоваться. Плагин делает #include <interface.h>
в своем заголовке.
Я скомпилирую DLL плагина следующим образом:
gcc myplugin.c -shared -Wl,--subsystem,windows -D MYPLUGIN_EXPORTS -o myplugin.dll -I..\main_program_headers
Затем я получаю следующие ошибки:
undefined reference to 'some function name'
Значит ли это, что я должен скомпилировать плагины с динамическими c, связанными с фактическими двоичными файлами, от которых они зависят в основной программе?
Если да, то это значит, что мне нужно хранить отдельные .o
файлы основной программы, даже после привязки их к результату .exe
? Может ли G CC напрямую ссылаться на файлы .o
?
В любом случае, я очень надеялся, что LoadLibrary
позаботится об исправлении ссылок на функции при загрузке во время выполнения. Не так ли?
Обновление:
Как любезно ответил @tenfour, DLL должна следовать нормальным правилам компоновки, и ссылки на функции должны быть решено во время сборки. Он / она предложил систему, в которой хост-программа переходит в указатели плагинов для необходимой функции.
Этот подход действительно будет работать, но я все же хотел бы знать:
Какая сборка необходимо, чтобы плагин вызывал функции из основного приложения напрямую, без какой-либо специальной системы во время выполнения (кроме LoadLibrary
).
Я хотел бы сказать, что моим основным источником влияния здесь является система расширения для интерпретатора CPython. Мне кажется, судя по его документации , что расширение CPython не получает указатели функций от интерпретатора хоста и все еще может напрямую вызывать функции Py_*
из него.
Есть идеи, как это можно сделать? Как можно создать плагин DLL для поддержки этого? На что и как мне нужно ссылаться?