использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 08:37
Оценка:
Всем доброго дня,
изучил результаты поиска по "dll linux" на сайте, но так и не нашел как можно использовать собранную win dll-ку в программе для Linux. Ось CentOS 5.0. Я так понял можно как-то использовать Wine для этого, но детали непонятны. Как это должно выглядеть? Можно какой-нибудь простой пример как из кода как будет выглядеть вызов функций из моей длл-ки, и что нужно сделать для поддержки этих вызовов? Пытась найти ответ на winehq.org, но пока безуспешно.
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re: использование dll в Linux?
От: LuciferSaratov Россия  
Дата: 19.10.09 09:02
Оценка: 2 (1)
Здравствуйте, Alexey_VL, Вы писали:

>Пытась найти ответ на winehq.org, но пока безуспешно.


Нужно использовать штуку под названием winelib.
Официальная документация по winelib здесь: http://www.winehq.org/docs/winelib-guide/index
Ещё вот это будет полезно: http://wiki.jswindle.com/index.php/WineLib
Конкретно по загрузке DLL вот тут: http://wiki.jswindle.com/index.php/WineLib#Calling_a_Native_Windows_dll_from_Linux

Сам сейчас поэксперементировал, получилось вот что.
Нашел в интернете готовую Windows DLL — из руководства, как делать DLL в Windows (http://www.flipcode.com/archives/Creating_And_Using_DLLs.shtml).
Взял оттуда код, который загружает DLL и выполняет из неё функции, немного подрихтовал и получил вот что:
#include <windows.h> 
#include <iostream> 
#include <stdio.h> 

using namespace std;

#define MAXMODULE 50 

typedef void (WINAPI*cfunc)();

cfunc NumberList;
cfunc LetterList;

int main(int argc, char *argv[]) {
      HINSTANCE hLib=LoadLibrary("DLLTEST.DLL");
      if(hLib==NULL) {

           cout << "Unable to load library!" << endl;
           return -1;
      }
      char mod[MAXMODULE];
      GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAXMODULE);
      cout << "Library loaded: " << mod << endl;
      NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");
      LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList");
      if((NumberList==NULL) || (LetterList==NULL)) {

           cout << "Unable to load function(s)." << endl;
           FreeLibrary((HMODULE)hLib);
           return -1;
      }
      NumberList();
      LetterList();
      FreeLibrary((HMODULE)hLib);
      return 0;
}


Собирать при помощи вот такой команды:
$ wineg++ dllrun.cpp -o dllrun


На выходе будет файл с названием dllrun.exe, запускать его.
Re[2]: использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 09:58
Оценка:
Я так понимаю, что мне winelib не подойдет, потому что у меня Linux-приложение, которое я не могу скомпилировать как виндовское с помощью Winelib. Исходников dll-ки у меня тоже нет.
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re: использование dll в Linux?
От: Sheridan Россия  
Дата: 19.10.09 10:35
Оценка:
Приветствую, Alexey_VL, вы писали:

Можно озвучить — для чего? Что в той длл такого?
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[2]: использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 11:07
Оценка:
S>Можно озвучить — для чего? Что в той длл такого?

В DLL драйвер под Виндос для устройства на СОМ-порте, который можно самостоятельно написать и под Linux, но это потребует времени. Задача как можно быстрее начать работать с устройством для демонстрации оного. В дальнейшем уже можно будет сделать нормально, написав драйвер под Linux. Ну и вообще для общего развития интересно — неужели нет проги-эмулятора, позволяющей работать с виндовскими длл-ками в Линуксе, с учетом существования WINE
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re[3]: использование dll в Linux?
От: rising_edge  
Дата: 19.10.09 11:13
Оценка:
Здравствуйте, Alexey_VL, Вы писали:

S>>Можно озвучить — для чего? Что в той длл такого?


A_V>В DLL драйвер под Виндос для устройства на СОМ-порте


А оная DLL небось через драйвер COM-порта работает? И как вы собираетесь виндовой DLL лазить в устройство через линуксовый драйвер COM-порта?
Re[3]: использование dll в Linux?
От: Sheridan Россия  
Дата: 19.10.09 11:17
Оценка:
Приветствую, Alexey_VL, вы писали:

AVL> S>Можно озвучить — для чего? Что в той длл такого?


AVL> В DLL драйвер под Виндос для устройства на СОМ-порте, который можно самостоятельно написать и под Linux, но это потребует времени. Задача как можно быстрее начать работать с устройством для демонстрации оного. В дальнейшем уже можно будет сделать нормально, написав драйвер под Linux.

Советую сразу начинать писать драйвер, емнип там это нетрудно.
А демонстрацию лучше на виндах демонстрируйте, раз уж там готовое есть.

AVL>Ну и вообще для общего развития интересно — неужели нет проги-эмулятора, позволяющей работать с виндовскими длл-ками в Линуксе, с учетом существования WINE

А оно надо? Оно ненадо. Да и вредно.
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[3]: использование dll в Linux?
От: LuciferSaratov Россия  
Дата: 19.10.09 11:24
Оценка:
Здравствуйте, Alexey_VL, Вы писали:

A_V>Я так понимаю, что мне winelib не подойдет, потому что у меня Linux-приложение, которое я не могу скомпилировать как виндовское с помощью Winelib. Исходников dll-ки у меня тоже нет.


Насколько я понимаю, вот эти самые winegcc и wineg++ никоим образом не запрещают использовать обычные линуксовые библиотеки и системные вызовы. Т.е. если собирать программу при помощи winegcc, то можно использовать как WinAPI, так и линуксовые API.
Код, необходимый для инициализации WINE, winegcc генерирует сам.
Re[4]: использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 11:32
Оценка:
_>А оная DLL небось через драйвер COM-порта работает? И как вы собираетесь виндовой DLL лазить в устройство через линуксовый драйвер COM-порта?

Хм, а собственно почему виндовой? Я так понимаю WINE подменяет вызовы виндос длл-ок на свои реализации. Думаю kernel32 входит в число длл-ок вызовы которых заменили.
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re[4]: использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 11:41
Оценка:
S>А демонстрацию лучше на виндах демонстрируйте, раз уж там готовое есть.

Суть в том, что продемонстрировать надо работу Linux-программы. Так что виндос тут не подходит.

AVL>>Ну и вообще для общего развития интересно — неужели нет проги-эмулятора, позволяющей работать с виндовскими длл-ками в Линуксе, с учетом существования WINE

S>А оно надо? Оно ненадо. Да и вредно.

Хм, ну мне вот сейчас например надо. И судя по количеству аналогичных вопросов в нете, не только мне. Это может и не здорово для использования как архитектурное решение, но в плане временно поставить стороннюю длл-ку в свое Линукс приложение при портировании очень даже неплохо — можно сразу смотреть что получается.
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re[4]: использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 11:47
Оценка:
LS>Насколько я понимаю, вот эти самые winegcc и wineg++ никоим образом не запрещают использовать обычные линуксовые библиотеки и системные вызовы. Т.е. если собирать программу при помощи winegcc, то можно использовать как WinAPI, так и линуксовые API.
LS>Код, необходимый для инициализации WINE, winegcc генерирует сам.

Угу, дочитал Wine-wiki до ответа на свой вопрос. А если у меня только часть исходников Linux-проги, которая используются для собирания so библиотек — никаких подводных камней не возникнет при стыковке с основной частью приложения, которая собрана обычным gcc?
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re[5]: использование dll в Linux?
От: LuciferSaratov Россия  
Дата: 19.10.09 12:05
Оценка:
Здравствуйте, Alexey_VL, Вы писали:

A_V>Угу, дочитал Wine-wiki до ответа на свой вопрос. А если у меня только часть исходников Linux-проги, которая используются для собирания so библиотек — никаких подводных камней не возникнет при стыковке с основной частью приложения, которая собрана обычным gcc?


Я думаю, чтобы проблем не было, нужно итоговый исполняемый файл линковать при помощи winegcc/wineg++ — чтобы были прилинкованы все нужные библиотеки.
Re[6]: использование dll в Linux?
От: Alexey_VL  
Дата: 19.10.09 14:00
Оценка:
LS>Я думаю, чтобы проблем не было, нужно итоговый исполняемый файл линковать при помощи winegcc/wineg++ — чтобы были прилинкованы все нужные библиотеки.

В итоге нашел все ответы на свои вопросы в Wine-wiki. Спасиб за ссылку Вот похоже наиболее оптимальный подход для решения задачи по использованию длл-ки в Линукс приложении (из Wine-wiki):

A programmer asked Jun 2007 Wine devel]: [How can I write a shared library that uses Wine and can be called from a non-winelib app?]

S. Dossinger: your plugin, that loads the dll, needs to run in Wine's environment in order to be able to load the dll. So you have to write a winelib dll. If the plugin is loaded as a library in your host app, the whole host app would have to be a winelib app. Not good So you can split your plugin into two parts, one is the plugin that runs in the host app, the other one is a seperate winelib application that runs in a seperate process and loads the win32 dll. That way the dll gets the virtual memory setup it needs. The two parts of your plugin can use any Unix IPC techniques you feel like using — sockets, pipes, shared memory, semaphores, whatever. You could forward function calls using pipes, transport bigger blobs using shared memory, and synchronise everything using semaphores(and implicit pipe synchronisation).


В принципе была такая мысль с самого начала, но думал, что все-таки есть готовые решения.
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.