Преобразование статической библиотеки ссылок в динамическую dll - PullRequest
13 голосов
/ 05 марта 2010

У меня есть файл .lib с файлом заголовка (.h). В этом файле есть несколько функций, которые необходимо использовать в приложении C #.

После поиска в Google я обнаружил, что мне нужно создать динамическую DLL из этой статической библиотеки и вызвать эту динамическую DLL из кода C # с помощью взаимодействия.

  1. Я создал проект win32 и выбрал тип DLL.
  2. Включен заголовочный файл и добавлен .lib для дополнительных зависимостей.

    Я могу видеть функции, определенные в статической библиотеке (когда я нажимаю Ctrl + пробел).

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

void testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)

Мне нужна такая же подпись в моей динамической DLL с другим именем.

Что писать в заголовочном файле и .cpp файле?

Ответы [ 6 ]

6 голосов
/ 05 марта 2010

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

void __declspec(dllexport) testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)

Если вы не можете этого сделать, вы можете экспортировать их, написав вместо этого файл .def. Используя файлы def, вы можете даже изменить имя функции по мере ее экспорта. http://msdn.microsoft.com/en-us/library/28d6s79h.aspx

---- содержимое mylib.def ----

LIBRARY

EXPORTS
   testfun
   newname=testfun2

Затем, когда вы связываете dll, включите mylib.def

link /dll /machine:x86 /def:mylib.def  mylib.lib

Edit2:

обратите внимание, что pinvoke предполагает, что импортируемые вами функции будут иметь соглашение о вызовах _stdcall, если вы не скажете иначе. Так что, возможно, вам придется сделать это и в коде C #.

[DllImport("mylib.dll", CallingConvention=CallingConvention.Cdecl)]

Или вы можете изменить код C ++ на __stdcall

void __declspec(dllexport) __stdcall testfun( char* inp_buff, ...
3 голосов
/ 05 марта 2010

Это то, что вы можете сделать

  1. Добавьте следующий код в ваш файл .H. переименуйте «MYPROJECT» в название вашего проекта

    #ifdef MYPROJECT_EXPORTS
    #define MYPROJECT_API __declspec(dllexport)
    #else
    #define MYPROJECT_API _declspec(dllimport)
    #endif
    
  2. Перейдите в Свойства-> C ++ -> Препроцессор и добавьте определение - MYPROJECT_EXPORTS

  3. Добавьте MYPROJECT_API ко всем функциям, которые вы хотите предоставить dll, например:

    MYPROJECT_API void Test();
    
  4. Перейдите в Свойства проекта Общие -> Тип конфигурации, измените его на Dynamic Dll

Вы сделали

3 голосов
/ 05 марта 2010

Создайте новый проект Dll с помощью мастера приложений Visual Studio и установите флажок «Экспортировать символы» на одном из шагов мастера. Он создает образец Dll, который экспортирует класс, функцию и переменную. Из этого примера вы можете узнать, как это сделать. Обычно каждая экспортируемая функция объявляется как __declspec (dllexport). В клиентском проекте он объявлен как __declspec (dllimport). Код Dll использует константу, которая дефилируется как __declspec (dllexport) внутри проекта Dll, и __declspec (dllimport) в любом другом месте.

1 голос
/ 21 декабря 2010

существует две версии LIB, Первый - это динамическая библиотека (исходный файл + заголовок + динамическая библиотека) -> для доступа к DLL

или статическая lib = (динамическая библиотека + DLL) -> (исходный файл + заголовок) -> для доступа к библиотеке DLL.

если у вас есть Dynamic Lib> нет способа создать DLL (вы ничего не можете получить из ничего), dynamic lib - это просто интерфейс,

но если у вас есть Static Lib, то DLL не нужна для доступа к функциям.

0 голосов
/ 31 мая 2016

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

Если вы пойдете с подходом __delcspec и сначала создадите статическую библиотеку, а затем попытаетесь ссылаться на нее при сборке библиотеки DLL, вам придется решить проблему удаления мертвого кода.

Когда вы создаете ссылку, srcs obj используется для поиска всех декорированных экспортов, а зависимости разрешаются, а все остальное удаляется. Если у вас нет DLL src, поэтому нет obj-файлов (кроме, возможно, dll main), весь код в lib, который вы хотите экспортировать, будет удален (независимо от атрибутов).

Итак, вы должны:

  1. Скажите компоновщику, чтобы он не удалял неиспользуемый код, который, вероятно, даст вам много ненужного.
  2. Использование файла def для предоставления экспорта вручную
  3. Свяжите dll с файлами obj, использованными для создания библиотеки, вместо того, чтобы напрямую ссылаться на библиотеку.
  4. Или, возможно, создайте фиктивный код, который ссылается на функции, которые вы хотите экспортировать из того, что вы экспортируете.
0 голосов
/ 13 сентября 2012

Посмотрите на мой ответ на этот вопрос для возможного решения. Почти положительно, это будет работать для вас ...

Вкратце: включите опцию «Использовать входы зависимостей библиотеки» в настройках компоновщика. Если установлено значение «истина», оно принудительно связывает ВСЕ символы и код, объявленные в каждой LIB, указанной как входные данные для проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...