2013-03-16 2 views
3

У меня есть главный исполняемый файл, который загружается. dll/.so Плагины, которые отлично работают в Linux, но на окнах (Visual Studio 2012), не работают с неопределенными ссылочными ошибками..dll Плагин, который использует функции, определенные в основном исполняемом файле

Плагин использует такие функции, как session->SendLine("bla"), которые определены в главном исполняемом файле. (класс методов сеанса ans, определенных в .h, включенных в плагин, но фактическая функция в .cpp, скомпилированном в главном exec).

Т.Л., д-р: «Мне нужны окна компоновщика, чтобы игнорировать неопределенные ссылки в плагинах, определенный в основной исполняемый»

Каков наилучший способ «заставить его работать» в окнах, но держать его совместимы с Linux без миллиона #ifdef?

+0

Может лет u делите хотя бы заголовок интерфейса подключаемого модуля? –

+0

интерфейс: http://privatepaste.com/c6118a7e85 example_plugin: http://privatepaste.com/dd152f6c6 session-> Отправить() == void session :: Отправить (CString str) {... отправить что-либо через socket ...} – Naga

+0

Я разместил заголовок непосредственно в вопросе, кажется, что заголовок готов к работе из Windows POV ... –

ответ

3

Связывание библиотек в Windows обрабатывается совершенно по-другому, чем в Linux. Связывание с плагином для исполняемого файла просто для Linux, но не столько для Windows.

В Windows традиционный способ подключения к внешнему модулю - использовать библиотеку импорта, предоставляемую файлом .lib. Для этого вам потребуется создать библиотеку импорта для исполняемого файла, которая включает в себя все экспортированные функции, которые должны выполнять ваши плагины. Я никогда не создавал библиотеку импорта для исполняемого файла. Обычно вы делаете это для DLL. Я даже не уверен, что он будет работать для исполняемого файла.

Некоторые другие варианты:

  1. Экспорт функций из исполняемого файла, и использовать GetProcAddress в плагине, чтобы связываться с ними во время выполнения.
  2. Когда вы инициализируете плагины, передайте интерфейс, содержащий всю необходимую им функциональность.
2

Для вызова функций, определенных в исполняемом файле из библиотеки DLL, вы должны экспортировать эти функции из исполняемого файла, используя __declspec (dllexport), точно так же, как вы экспортируете функции из библиотеки DLL.

Компилятор создаст библиотеку импорта для исполняемого файла, которая включает в себя заглушки для экспортируемых функций.

Ссылка на эту библиотеку импорта при создании вашей DLL.

2

При использовании MinGW, это может быть сделано путем создания библиотеки импорта для исполняемого файла следующим образом:

$ dlltool --export-all-symbols <program>.exe -l lib<program>.a -D <program>.exe 

-l аргумент задает имя файла библиотеки должны быть созданы, а -D аргумент указывает DllName библиотеки (и важно, чтобы это было равно имени программы). Чтобы скомпилировать dll, вам потребуется связать с библиотекой импорта, добавив -l<program> к флагам компоновщика.

Если вы хотите ограничить экспортированные символы, вы можете сначала создать Defs файл, отредактировать его, а затем создать библиотеку импорта из Defs файла:

$ dlltool --export-all-symbols <program>.exe -z <program>.defs 
$ vi <program>.defs # Edit the list of exported symbols 
$ dlltool -d <program>.defs -l lib<program>.a -D <program>.exe 

Примечание: г. Название dlltool может меняться в зависимости от среды mingw (т.е. i686-w64-mingw32-dlltool для Fedora для кросс-компиляции до окон i686).

0

У меня была такая же проблема - для патентованного приложения, a.exe, я хотел построить плагин, p.dll.

Один пост предложил:

$ dlltool --export-all-symbols a.exe -z a.defs 
dlltool: a.exe: no symbols 

Но есть файл a.lib в комплекте с A.exe. Опять же, нет [полезного] ЭКСПОРТА:

$ dlltool --export-all-symbols a.lib -z a.defs 

$ cat a.defs 
; dlltool --export-all-symbols -z a.defs q.lib 
EXPORTS 
    _NULL_IMPORT_DESCRIPTOR @ 1 DATA 
    _IMPORT_DESCRIPTOR_a @ 2 DATA 

[не смотрите также Building a dll with a gcc using a library file (.a) converted from import library (.lib)

В конце концов, найти намек на список рассылки MinGW, нм было решением для меня:

$ echo EXPORTS >a.def 
$ nm -p a.lib |egrep 'T _' |sed 's/0* T _//' >>a.def 

Когда у вас есть этот .def-файл, это легко:

$ #generate liba.a that has the callbacks for the symbols in *a.exe* (what a.lib has, too) 
$ dlltool -v -l liba.a -d a.def 

$ #build my plugin, linking to liba.a 
$ gcc -shared p.c -L. -la -o p.dll