Здравствуйте.
Например, устанавливаем mt4 в linux, запускаем через Wine. Возможно ли прикрутить динамические библиотеки линукса (.so) к wine->mt4? Возможно ли научить g++ (не из mingw) компилировать .dll?
Пока плотно этим вопросом не занимался, разбираюсь с Linux'ом, хочу понять перспективы.
Прикрутить so к виндовой программе так же нельзя как прикрутить dll к никсовой. Вот когда будет ось, которая будет сама понимать оба формата, тогда прикрутите (подсказка: ее не будет)
Мне кажется, что самой программе фиолетово .so или .dll, должен отличаться лишь загрузчик.
Мне кажется, что самой программе фиолетово .so или .dll, должен отличаться лишь загрузчик.
Напишите программу под винду с вызовом .so и покажите всем что так возможно сделать в принципе.
Мне кажется, что самой программе фиолетово .so или .dll, должен отличаться лишь загрузчик.
Как вам кажется, если отличается лишь загрузчик, то зачем тогда потребовалось писАть целый wine, аж эмулятор операционной системы, чтоб запускать виндовые программы на линуксе? Это же две совершенно рзлиные оси, у них и работа с памятью, и объекты, и файловые системы, да б-г знает что еще ну просто разное, на 0% совместимое друг с другом.
Хотя, конечно, если вы напишете прогу на ассемблере под x86/64 без использования ресурсов ОС (включая, скажем, такие базовые вещи как выделение памяти), то тогда да, работать она будет одинаково на любой системе. Да и то с поправкой на тот факт, что формат файла программы различается.
Вы таки удивитесь и очень будете смеяться, но код ассемблера тоже различается для Вин и Лин, не говоря уж про бинарники )))
Простой пример одной и той же программки:
Линь |
Вынь |
---|---|
" section .data msg: db "Hello, World!", 10 .len: equ $ - msg section .text global main main: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, msg.len int 0x80 mov eax, 1 mov ebx, 0 int 0x80 " | %include 'win32n.inc' extern GetStdHandle import GetStdHandle kernel32.dll extern WriteConsoleA import WriteConsoleA kernel32.dll extern ExitProcess import ExitProcess kernel32.dll section data use32 class = data msg: db "Hello, World!", 13, 10 .len: equ $ - msg section code use32 class = code ..start: push STD_OUTPUT_HANDLE call [GetStdHandle] push NULL push NULL push msg.len push msg push eax call [WriteConsoleA] push NULL call [ExitProcess] |
Эту тему я создавал в прошой жизни ).
Удалось прикрутить linux библиотеки к wine->mt4. Для интересующихся оставлю небольшое руководство, все действия на debian i386:
- $ apt-get install wine
- $ apt-get install wine32-dev-tools
- Делаем тествовую linux библиотеку, копируем (скомпилированную) (в каталоге проекта библиотека нужна для дальнейшей линковки) в один из каталогов для поиска библиотек или через LD_LIBRARY_PATH:
// linux_lib.cpp extern int fn(int i, double d) { return i + d; }
- $ gcc linux_lib.cpp -fpic -shared -o linux_lib.so
- Создаем переходник wine <--> linux:
// wrapper.cpp extern int fn(int, double); // Должно быть в linux_lib.h extern "C" int fn_wr(int i, double d) { return fn(i, d); }
- Создаём spec файл:
# wrapper.spec 1 cdecl fn_wr(long double)
- Находим winegcc: $ find /usr -name winegcc . Добавляем двоеточеи и каталог winegcc в переменную PATH.
- $ winegcc wrapper.cpp wrapper.spec linux_lib.so -fpic -shared -o mt.dll
- Библиотека переходник готова, кидаем ее в Libraries терминала.
- Тест:
#property strict #import "mt.dll.so" int fn_wr(int, double); #import void OnStart() { Alert( fn_wr(5, 3) ); }
Синтаксис spec файла: http://www.winehq.org/docs/winelib-guide/spec-file
Целочисленный аргумента не превышающий 4 байта в spec файле указываются как long.
P.S: линукс библиотеку можно "вшить" в переходник, ключ -static если не ошибаюсь.
Я неправильно выбрал имя для linux библиотеки. Все имена либ должны начинаться с lib, например liblinux_lib.so. Иначе либа имеет шанс быть ненайденной в стандартных путях для поиска (/etc/ld.so.conf).
После того как положили либу в стандартное место (/usr/local/lib например), то возможно потребуется вызвать ldconfig от root'a, для обновления базы библиотек.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Например, устанавливаем mt4 в linux, запускаем через Wine. Возможно ли прикрутить динамические библиотеки линукса (.so) к wine->mt4? Возможно ли научить g++ (не из mingw) компилировать .dll?
Пока плотно этим вопросом не занимался, разбираюсь с Linux'ом, хочу понять перспективы.