![]() |
|
![]() ![]() ![]() |
|
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
Надо сделать динамическую библиотеку для того что бы работать со своими
функциями из готовой программы не моей. прочитал тут http://mech.math.msu.su/~zubr/library.html первый шаг проходит g++ -fPIC -Wall -c testdll.cpp а второй шаг g++ -o testdll testdll.o -ldl приносит ошибку g++ -o testdll testdll.o -ldl C:\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -ldl collect2: ld returned 1 exit status компилирование с gcc дает то же самое. в чем дело? может быть есть где поподробнее почитать. что это за параметр -ldl и вообще про \ъ создание библиотек в плане компиляции на данно этапе. заранее спасибо. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: нет Всего: 211 |
держи работающий Makefile, замени имена файлов и наслаждайся возможностями make
|
|||
|
||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
компилирует с предупреждением
g++: unrecognized option `-rdynamic' но библиотека не работает. к сожалению. error 127 библиотеку загружает но функцию исполнить не может. а пример с заранее откомпилированной библиотекой работает. но и то легче, будем искать. Это сообщение отредактировал(а) cooper123 - 3.3.2009, 19:38 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: нет Всего: 211 |
у меня Makefile под юникс, не знаю как там в CygWin, Должно было быть также..А код можешь показать? Посмотрим почему не вызывает
Добавлено через 19 секунд Но максимум что я смогу протестировать - это линукс |
|||
|
||||
cooper123 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
не cygwin а mingw (win32) это немного другое. за образец я взял поставку с metatreder там есть образец. уже откомпилированный. но ошибка видимо все таки в компилировании потому как предварительно откомпилированный работает. в линуксе метатрейдера нет, к сожалению. вот код там еще h файл есть и модуль на мкуль который всю эту систему использует. но думаю тут приводить смысла нет.
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: нет Всего: 211 |
Ааа, извини спутал с какой-то другой темой, мне казалось у тебя CygWin..
почитай тут как компилить и запиши флаги в Makefile http://sig9.com/node/35 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
В статье описание для Linux, у тебя Windows - там загрузка библиотек делается другими вызовами
|
||||
|
|||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
Спасибо за ответ xvr. а что там надо где можно почитать. та ссылка которую дал acesmcar она вроде как про статические библиотеки. а мне нужно сделать длл для виндовской программы именно метатрейдер, и для пробы я компилирую программу которая приходит вместе с метатрейдерома. в ссылке от acesmcar я выдернул следующий штук g++ -v -shared -o ExpertSample.dll ExpertSample.o -Wl,--out-implib, ExpertSample.dll что оно обозначает я не знаю. вот эксперементирую с этим. опция -v выдает конфигурацию компилера насколько я понял. g++ -v -shared -o ExpertSample.dll ExpertSample.o -Wl,--out-implib, ExpertSample.dll g++ -v -shared -o ExpertSample.dll ExpertSample.o -Wl,--out-implib, ExpertSample.dll Reading specs from C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/specs Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.2 (mingw-special) C:/MinGW/bin/../libexec/gcc/mingw32/3.4.2/collect2.exe --shared -Bdynamic -e _DllMainCRTStartup@12 -o ExpertSample.dll /mingw/lib/dllcrt2.o C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/crtbegin.o -LC:/MinGW/bin/../lib/gcc/mingw32/3.4.2 -LC:/MinGW/bin/../lib/gcc -L/mingw/lib/gcc/mingw32/3.4.2 -LC:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/lib -L/mingw/lib/gcc/mingw32/3.4.2/../../../../mingw32/lib -L/mingw/lib -LC:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../.. -L/mingw/lib/gcc/mingw32/3.4.2/../../.. ExpertSample.o --out-implib ExpertSample.dll -lstdc++ -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/crtend.o Creating library file: ExpertSample.dll библиотека создается но не работает. в конфигурациях компилера там есть --disable-shared что по моим понятиям означает динамическая библиотека не будет создаваться, хотя может быть относится к самому компилятору что он не может пользоваться динамическими библиотеками. пока не нашел ничего что может наставить на путь истинный, чтения мануала по gcc тоже успеха пока не дало. переходить на мелкософтовский компилятор не хочется. хотя может стоит. не знаю. кругом проблеммы. |
|||
|
||||
xvr |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Вполне сойдет
-shared - Создание .dll -o ExpertSample.dll - Имя выходного файла ExpertSample.o - Имя входного объектника -Wl,--out-implib, ExpertSample.dll - А вот это должно быть так -Wl,--out-implib,ExpertSample.lib - создание библиотеки импорта (для последующей линковки с вашей dll)
![]()
|
||||||||||
|
|||||||||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
понадеялся что это и была ошибка но оно не так. Спасибо большое каша в голове немного начинает укладываться. сделал так g++ -fPIC -Wall -c ExpertSample.cpp -- создание обьектного файла оно пишет ExpertSample.cpp:1: warning: -fPIC ignored for target (all code is position independent) надеюсь что это не повлияет на результат. второй шаг g++ -v -shared -o ExpertSample.dll ExpertSample.o -Wl,--out-implib,ExpertSample.lib хотя зачем мне ExpertSample.lib нужна я не понял. поэтому можно наверное и так g++ -v -shared -o ExpertSample.dll ExpertSample.o В обоих случаях библиотека создавалась но не работала. Сообщения с метатрейдера - программа где используется это библиотека - библиотека загрузилась успешно а вызов функции не проходит. 2009.03.06 14:18:58 ExportFunctions EURUSD,M15: cannot call function 'GetIntValue' from dll 'ExpertSample.dll' (error 127) тут я не знаю что делать что читать или что пробывать или дебужить. как я уже говорил откомпилированная программа работает |
|||
|
||||
Acer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
cooper123, какая IDE?
Без этого работает тоже ![]()
везде одинаково ps. gcc/g++ не нужно *.lib файлы Добавлено через 2 минуты и 15 секунд ps. ps. cooper123, пользуйся кнопкой "КОД". От твоих сообщений глаза можно поламать |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Поменяй #define MT4_EXPFUNC __declspec(dllexport) на #define MT4_EXPFUNC extern "C" __declspec(dllexport)
|
|||
|
||||
cooper123 |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
не помогло Добавлено @ 18:24
Acer,ручками я больше. Емакс. хотя сейчас скачал DevC++ 4.9.9.2 попробывал там сделать длл проект. оно компилит все но сама длл не работает.
сцори, все никак не привыкну. Код я вроде в код поместил, а вот для остального я что не очень еще принаровился. вот что пишет DEVC++
Это сообщение отредактировал(а) cooper123 - 6.3.2009, 18:37 |
||||||||
|
|||||||||
Acer |
|
||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
поменяй в том месте, где это нужно, а не в том, в котором ты поменял Добавлено @ 18:33
Вот так g++ собирает библиотеку под виндой. В заголовке самой длл нужно обьявлять функции или классы как
В заголовке, через который мы подключаем dll нужно обьявлять функции так:
В Makefile мы указываем
где mylib - это mylib.dll , которая лежит в /path/to/my/lib Это сообщение отредактировал(а) Acer - 6.3.2009, 18:37 |
||||||||||||||
|
|||||||||||||||
cooper123 |
|
||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
Если бы я был таким умным как предполагает это высказывание я бы сюда не писал бы. Я поменял там где посчитал нужным. Если оно отличается от того где надо то это надо как то явно выразить, потому без этого я поменяю там где я уже поменял.
ну вроде так оно и есть.
все дело в том что я делаю длл к готовой программе и как там все сделано я не знаю.
а это я не понял о какой библиотеке идет речь? посмотрел чем отличается длл которую я компилирую и которая уже готовая. которая готовая 20 кил моя 15 кил . и в готовой есть слова про kernel.dll и msvcrt.dll и там еще те же функции что и в основной длл с нижними штрихами и видимо функции из системных длл. мож действительно надо что то цыплять. Это сообщение отредактировал(а) cooper123 - 6.3.2009, 19:11 |
||||||||||||||
|
|||||||||||||||
Acer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
Это я написал как линковать библиотеку к бинарнику, который ты компилишь.
Вот это есть в твоем коде? Это сообщение отредактировал(а) Acer - 6.3.2009, 19:03 |
||||
|
|||||
cooper123 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
да есть. код тестовой программы в пятом посте с начала по времени 3.3.2009, 20:43
понятно. мне это не надо. я пишу только длл которая должна использоваться в готовой программе. |
||||||
|
|||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Посмотри (через objdump например), какие функции экспортируются из твоей dll и какие из готовой. Возможно они по разному записываются
|
|||
|
||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
заработала спасибащще ограмущщее. в гнусной библиотеке функция записывается как _Z11GetIntValuei@4 вместо GetIntValue переписал в вызывающей програме и заработало на то как есть и заработало. урррраааа!!!!! а может быть можно сделать так что бы оно по человечески работало? |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Это С++ mangling. У gcc и VC они отличаются.
|
||||||
|
|||||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
Devc++ компилит нормально. через длл врапер. разберусь теперь. там и майк есть. спасибо еще раз. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | GNU toolchain | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |