Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите сделать библиотеку, ошибка при компилировании, в чем дело 
V
    Опции темы
cooper123
Дата 3.3.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 и вообще про \ъ
создание библиотек в плане компиляции на данно этапе. 

заранее спасибо. 
PM MAIL   Вверх
azesmcar
Дата 3.3.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



держи работающий Makefile, замени имена файлов и наслаждайся возможностями make

Код

CXX      = g++
CXXFLAGS = 
INCPATH  = -I.
LINK     = g++
LFLAGS   = -shared -rdynamic 
DEL_FILE = rm -f
SYMLINK  = ln -sf
DEL_DIR  = rmdir
LIBS     = 

####### Output directory

OBJECTS_DIR = ./

####### Files

HEADERS = header1.h \
        header2.h
SOURCES = cppfile1.cpp \
        cppfile2.cpp
OBJECTS = cppfile1.o \
        cppfile2.o

DESTDIR  = 
TARGET   = ./mylib.so

first: all
####### Implicit rules

.SUFFIXES: .c .o .cpp .cc .cxx .C

.cpp.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(OBJECTS)  
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

clean:
    -$(DEL_FILE) $(OBJECTS)
    -$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
    -$(DEL_FILE) $(TARGET) $(TARGET)

install:

uninstall:

####### End


PM   Вверх
cooper123
Дата 3.3.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



компилирует с предупреждением 
g++: unrecognized option `-rdynamic'

но библиотека не работает. к сожалению.  error 127 
библиотеку загружает но функцию исполнить не может. 
а пример с заранее откомпилированной библиотекой работает. 
но и то легче, будем искать. 

Это сообщение отредактировал(а) cooper123 - 3.3.2009, 19:38
PM MAIL   Вверх
azesmcar
Дата 3.3.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



у меня Makefile под юникс, не знаю как там в CygWin, Должно было быть также..А код можешь показать? Посмотрим почему не вызывает

Добавлено через 19 секунд
Но максимум что я смогу протестировать - это линукс
PM   Вверх
cooper123
Дата 3.3.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(azesmcar @ 3.3.2009,  20:06)
у меня Makefile под юникс, не знаю как там в CygWin, Должно было быть также..А код можешь показать? Посмотрим почему не вызывает

Добавлено @ 20:07
Но максимум что я смогу протестировать - это линукс


не cygwin а mingw (win32) это немного другое. 
за образец я взял поставку с metatreder там есть образец. уже откомпилированный. 
но ошибка видимо все таки в компилировании потому как предварительно откомпилированный работает. 
в линуксе метатрейдера нет, к сожалению. 
вот код там еще h файл есть и модуль на мкуль который всю эту систему использует. 
но думаю тут приводить смысла нет. 
Код

//+------------------------------------------------------------------+
//|                                              Sample DLL for MQL4 |
//|                 Copyright © 2004-2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#pragma pack(push,1)
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)
//----
struct MqlStr
  {
   int               len;
   char             *string;
  };
static int CompareMqlStr(const void *left,const void *right);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall GetIntValue(const int ipar)
  {
   printf("GetIntValue takes %d\n",ipar);
   return(ipar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetDoubleValue(const double dpar)
  {
   printf("GetDoubleValue takes %.8lf\n",dpar);
   return(dpar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC char* __stdcall GetStringValue(char *spar)
  {
   printf("GetDoubleValue takes \"%s\"\n",spar);
   return(spar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetArrayItemValue(const double *arr,const int arraysize,const int nitem)
  {
//----
   if(arr==NULL)
     {
      printf("GetArrayItemValue: NULL array\n");
      return(0.0);
     }
   if(arraysize<=0)
     {
      printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize);
      return(0.0);
     }
   if(nitem<0 || nitem>=arraysize)
     {
      printf("GetArrayItemValue: wrong item number (%d)\n", nitem);
      return(0.0);
     }
//----
   return(arr[nitem]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC BOOL __stdcall SetArrayItemValue(double *arr,const int arraysize,const int nitem,const double value)
  {
//----
   if(arr==NULL)
     {
      printf("GetArrayItemValue: NULL array\n");
      return(FALSE);
     }
   if(arraysize<=0)
     {
      printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize);
      return(FALSE);
     }
   if(nitem<0 || nitem>=arraysize)
     {
      printf("GetArrayItemValue: wrong item number (%d)\n", nitem);
      return(FALSE);
     }
//----
   arr[nitem]=value;
   return(TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetRatesItemValue(const RateInfo* rates,const int rates_total,const int shift,const int nrate)
  {
//----
   if(rates==NULL)
     {
      printf("GetRatesItemValue: NULL array\n");
      return(0.0);
     }
//----
   if(rates_total<0)
     {
      printf("GetRatesItemValue: wrong rates_total number (%d)\n", rates_total);
      return(0.0);
     }
//----
   if(shift<0 || shift>=rates_total)
     {
      printf("GetRatesItemValue: wrong shift number (%d)\n", shift);
      return(0.0);
     }
//----
   if(nrate<0 || nrate>5)
     {
      printf("GetRatesItemValue: wrong rate index (%d)\n", nrate);
      return(0.0);
     }
//----
   int nitem=rates_total-1-shift;
   switch(nrate)
     {
      case 0: return double(rates[nitem].ctm);
      case 1: return rates[nitem].open;
      case 2: return rates[nitem].low;
      case 3: return rates[nitem].high;
      case 4: return rates[nitem].close;
      case 5: return rates[nitem].vol;
     }
//----
   return(0.0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall SortStringArray(MqlStr *arr,const int arraysize)
  {
//----
   if(arr==NULL)
     {
      printf("SortStringArray: NULL array\n");
      return(-1);
     }
   if(arraysize<=0)
     {
      printf("SortStringArray: wrong arraysize (%d)\n", arraysize);
      return(-1);
     }
//----
   qsort(arr,arraysize,sizeof(MqlStr),CompareMqlStr);
//----
   return(arraysize);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall ProcessStringArray(MqlStr *arr,const int arraysize)
  {
   int   len1,len2;
//----
   if(arr==NULL)
     {
      printf("ProcessStringArray: NULL array\n");
      return(-1);
     }
   if(arraysize<=0)
     {
      printf("ProcessStringArray: wrong arraysize (%d)\n", arraysize);
      return(-1);
     }
//----
   for(int i=0; i<arraysize-1; i++)
     {
      if(arr[i].string==NULL) len1=0;
      else len1=strlen(arr[i].string);
      if(arr[i+1].string==NULL) len2=0;
      else len2=strlen(arr[i+1].string);
      //---- uninitialized string
      if(arr[i+1].string==NULL) continue;
      //---- destination string is uninitialized and cannot be allocated within dll
      if(arr[i].string==NULL)   continue;
      //---- memory piece is less than needed and cannot be reallocated within dll
      if(arr[i].len<len1+len2)  continue;
      //---- final processing
      strcat(arr[i].string,arr[i+1].string);
     }
//----
   return(arraysize);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CompareMqlStr(const void *left,const void *right)
  {
   MqlStr *leftstr=(MqlStr *)left;
   MqlStr *rightstr=(MqlStr *)right;
//----
   if(leftstr->string==NULL) return(-1);
   if(rightstr->string==NULL) return(1);
//----
   return(strcmp(leftstr->string,rightstr->string));
  }
//+------------------------------------------------------------------+



PM MAIL   Вверх
azesmcar
Дата 3.3.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



Ааа, извини спутал с какой-то другой темой, мне казалось у тебя CygWin..

почитай тут как компилить и запиши флаги в Makefile
http://sig9.com/node/35
PM   Вверх
xvr
Дата 4.3.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(cooper123 @ 3.3.2009,  18:45)
Надо сделать динамическую библиотеку для того что бы работать со своими 
функциями из готовой программы не моей. 
прочитал тут http://mech.math.msu.su/~zubr/library.html

а второй шаг
       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

В статье описание для Linux, у тебя Windows - там загрузка библиотек делается другими вызовами
Цитата

в чем дело? может быть есть где поподробнее почитать. что это за параметр -ldl
Запрос на линковку с библиотекой libdl.so - поддержка run-time динамического линкования (dlopen/dlsym/etc) На Windows не нужна, и функции там для этого другие (LoadLibrary/etc)


PM MAIL   Вверх
cooper123
Дата 5.3.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 4.3.2009,  14:37)
Запрос на линковку с библиотекой libdl.so - поддержка run-time динамического линкования (dlopen/dlsym/etc) На Windows не нужна, и функции там для этого другие (LoadLibrary/etc)


Спасибо за ответ 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 тоже успеха пока не дало. 
переходить на мелкософтовский компилятор не хочется. хотя может стоит. не знаю. кругом проблеммы. 
PM MAIL   Вверх
xvr
Дата 5.3.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(cooper123 @ 5.3.2009,  19:12)
в ссылке от acesmcar я выдернул следующий штук
g++ -v -shared -o ExpertSample.dll ExpertSample.o -Wl,--out-implib, ExpertSample.dll

Вполне сойдет
Цитата

что оно обозначает я не знаю. вот эксперементирую с этим. 

-shared - Создание .dll
-o ExpertSample.dll - Имя выходного файла
ExpertSample.o  - Имя входного объектника
-Wl,--out-implib, ExpertSample.dll - А вот это должно быть так -Wl,--out-implib,ExpertSample.lib - создание библиотеки импорта (для последующей линковки с вашей dll)
Цитата

опция -v выдает конфигурацию компилера насколько я понял. 
Она выдает всю информацию о том, что делает компилятор
Цитата

Creating library file: ExpertSample.dll
Он вам перезаписал dll библиотекой импорта  smile 
Цитата

в конфигурациях компилера там есть --disable-shared что по моим понятиям означает динамическая библиотека не будет создаваться, 
Это относится к самому компилятору, точнее к его библиотекам. Говорит о том, что динамическая libgcc не создавалась. К вашему случаю отношения не имеет

PM MAIL   Вверх
cooper123
Дата 6.3.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 5.3.2009,  19:31)

Creating library file: ExpertSample.dll
Он вам перезаписал dll библиотекой импорта  smile 


понадеялся что это и была ошибка но оно не так. 

Спасибо большое каша в голове немного начинает укладываться. 

сделал так 
    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)

тут я  не знаю что делать что читать или что пробывать или дебужить. 
как я уже говорил откомпилированная программа работает 

PM MAIL   Вверх
Acer
Дата 6.3.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



cooper123, какая IDE?

Код

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

Без этого работает тоже smile

Цитата(xvr @ 4.3.2009,  14:37)
В статье описание для Linux, у тебя Windows - там загрузка библиотек делается другими вызовами

везде одинаково

ps. gcc/g++ не нужно *.lib файлы

Добавлено через 2 минуты и 15 секунд
ps. ps. cooper123, пользуйся кнопкой "КОД". От твоих сообщений глаза можно поламать
PM MAIL   Вверх
xvr
Дата 6.3.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Поменяй #define MT4_EXPFUNC __declspec(dllexport) на #define MT4_EXPFUNC extern "C" __declspec(dllexport)
PM MAIL   Вверх
cooper123
Дата 6.3.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 6.3.2009,  17:33)
Поменяй #define MT4_EXPFUNC __declspec(dllexport) на #define MT4_EXPFUNC extern "C" __declspec(dllexport)

не помогло

Добавлено @ 18:24
 
Цитата
какая IDE?

Acer,ручками я больше. Емакс.  
хотя сейчас скачал DevC++ 4.9.9.2   попробывал там сделать длл проект. 
оно компилит все но сама длл не работает. 
Цитата(Acer @ 6.3.2009,  17:17)
пользуйся кнопкой "КОД". От твоих сообщений глаза можно поламать

сцори, все никак не привыкну. Код я вроде в код поместил, а вот для остального я что не очень еще принаровился. 


вот что пишет DEVC++
Код

Compiler: Default compiler
Building Makefile: "C:\2mts\prob\ExpertSample\Makefile.win"
Executing  make clean
rm -f ExpertSample.o  ExpertSample.dll

g++.exe -c ExpertSample.cpp -o ExpertSample.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  -DBUILDING_DLL=1  

dllwrap.exe --output-def libExpertSample.def --driver-name c++ --implib libExpertSample.a ExpertSample.o  -L"C:/Dev-Cpp/lib" --no-export-all-symbols --add-stdcall-alias   -o ExpertSample.dll

c:\Dev-Cpp\Bin\dllwrap.exe: no export definition file provided.
Creating one, but that may not be what you want

Execution terminated
Compilation successful



Это сообщение отредактировал(а) cooper123 - 6.3.2009, 18:37
PM MAIL   Вверх
Acer
Дата 6.3.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Цитата(cooper123 @ 6.3.2009,  18:16)
Цитата(xvr @ 6.3.2009,  17:33)
Поменяй #define MT4_EXPFUNC __declspec(dllexport) на #define MT4_EXPFUNC extern "C" __declspec(dllexport)

не помогло
Цитата(Acer @ 6.3.2009,  17:17)
пользуйся кнопкой "КОД". От твоих сообщений глаза можно поламать

сцори, все никак не привыкну. Код я вроде в код поместил, а вот для остального я что не очень еще принаровился.

поменяй в том месте, где это нужно, а не в том, в котором ты поменял

Добавлено @ 18:33
Код

g++ -O3 -Wall -c -fmessage-length=0 -osrc\rsrd.o ..\src\rsrd.cpp
g++ -shared -olibrsrd.dll src\rsrd.o

Вот так g++ собирает библиотеку под виндой.

В заголовке самой длл нужно обьявлять функции или классы как
Код

__declspec( dllexport ) void my_function();
__declspec( dllexport ) MyClass {
};


В заголовке, через который мы подключаем dll нужно обьявлять функции так:
Код

__declspec( dllimport ) void my_function();
__declspec( dllimport ) MyClass {
};


В Makefile мы указываем
Код

LIBS = -L"/path/to/my/lib" -lmylib

где mylib - это mylib.dll , которая лежит в /path/to/my/lib

Это сообщение отредактировал(а) Acer - 6.3.2009, 18:37
PM MAIL   Вверх
cooper123
Дата 6.3.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата
поменяй в том месте, где это нужно, а не в том, в котором ты поменял 

Если бы я был таким умным как предполагает это высказывание я бы сюда не писал бы. 
Я поменял там где посчитал нужным. Если оно отличается от того где  надо то это надо как то явно выразить, потому без этого я поменяю там где я уже поменял. 

Цитата
Добавлено @ 18:33
Код

g++ -O3 -Wall -c -fmessage-length=0 -osrc\rsrd.o ..\src\rsrd.cpp
g++ -shared -olibrsrd.dll src\rsrd.o

Вот так g++ собирает библиотеку под виндой.

ну вроде так оно и есть. 

Цитата

В заголовке, через который мы подключаем dll нужно обьявлять функции так:
Код

__declspec( dllimport ) void my_function();
__declspec( dllimport ) MyClass {
};




все дело в том что я делаю длл к готовой программе и как там все сделано я не знаю. 


Цитата

В Makefile мы указываем
Код

LIBS = -L"/path/to/my/lib" -lmylib

где mylib - это mylib.dll , которая лежит в /path/to/my/lib

а это я не понял о какой библиотеке идет речь?


посмотрел чем отличается длл которую я компилирую и которая уже готовая. 
которая готовая 20 кил моя 15 кил . 
и в готовой есть слова про kernel.dll и msvcrt.dll  и там еще те же функции что и в основной длл с нижними штрихами и видимо функции из системных длл.  мож действительно надо что то цыплять. 


Это сообщение отредактировал(а) cooper123 - 6.3.2009, 19:11
PM MAIL   Вверх
Acer
Дата 6.3.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Цитата(cooper123 @ 6.3.2009,  18:51)
а это я не понял о какой библиотеке идет речь?

Это я написал как линковать библиотеку к бинарнику, который ты компилишь.

Код

__declspec( dllexport ) void my_function();
__declspec( dllexport ) MyClass {
};

Вот это есть в твоем коде?

Это сообщение отредактировал(а) Acer - 6.3.2009, 19:03
PM MAIL   Вверх
cooper123
Дата 6.3.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата

Код

__declspec( dllexport ) void my_function();
__declspec( dllexport ) MyClass {
};

Вот это есть в твоем коде?

да есть. 
код тестовой программы в пятом посте с начала по времени 3.3.2009, 20:43

Цитата

Это я написал как линковать библиотеку к бинарнику, который ты компилишь.

понятно. мне это не надо. я пишу только длл которая должна использоваться в готовой программе. 
PM MAIL   Вверх
xvr
Дата 6.3.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Посмотри (через objdump например), какие функции экспортируются из твоей dll и какие из готовой. Возможно они по разному записываются

PM MAIL   Вверх
cooper123
Дата 6.3.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 6.3.2009,  20:31)
Посмотри (через objdump например), какие функции экспортируются из твоей dll и какие из готовой. Возможно они по разному записываются

заработала
спасибащще ограмущщее.  
в гнусной библиотеке функция записывается как _Z11GetIntValuei@4 вместо GetIntValue 
переписал в вызывающей програме и заработало на то как есть и заработало. 

урррраааа!!!!!
а может быть можно сделать так что бы оно по человечески работало?
PM MAIL   Вверх
xvr
Дата 6.3.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(cooper123 @ 6.3.2009,  22:28)
Цитата(xvr @ 6.3.2009,  20:31)
Посмотри (через objdump например), какие функции экспортируются из твоей dll и какие из готовой. Возможно они по разному записываются

заработала
спасибащще ограмущщее.  
в гнусной библиотеке функция записывается как _Z11GetIntValuei@4 вместо GetIntValue 
переписал в вызывающей програме и заработало на то как есть и заработало. 

Это С++ mangling. У gcc и VC они отличаются. 
Цитата

а может быть можно сделать так что бы оно по человечески работало?
Я не знаю, как MingW манглит C++ имена, возможно его можно заставить это делать нормально. Для начала убрать extern "C", если не поможет, добавить extern "C++", поиграться с опциями ком. строки

PM MAIL   Вверх
cooper123
Дата 6.3.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 6.3.2009,  22:55)
Я не знаю, как MingW манглит C++ имена, возможно его можно заставить это делать нормально. Для начала убрать extern "C", если не поможет, добавить extern "C++", поиграться с опциями ком. строки


Devc++ компилит нормально. через длл врапер. 
разберусь теперь. там и майк есть. 

спасибо еще раз. 

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.1285 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.