Большущая просьба пособить с решением проблемы:
При сборке dll в gcc под виндой (3.4.2 mingw-special) в разделе экспорта в длл у функций имена пишутся без нижнего подчеркивания. А мне нужно, чтобы это нижнее подчеркивание было(длл потом подгружается из явы). -fleading-underscore не спасает ни в каком виде.
Например:
dll.h
#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif
extern "C" EXPORT void hello(void);
dll.c
#include <stdio.h>
#include "dll.h"
EXPORT void hello(void) {
printf ("Hello\n");
}
g++ -c -fleading-underscore dll.c -o dll.o
вот что пишет о dll.o nm:
00000000 b .bss
00000000 d .data
00000000 i .drectve
00000000 r .rdata
00000000 t .text
00000000 T _hello
U _printf
замечательно, есть подчеркивание.
собираем:
g++ -shared dll.o -o dll.dll
говорим pexports dll.dll
LIBRARY dll.dll
EXPORTS
hello
вот такое вот безобразие. мне же надо, чтобы было
LIBRARY dll.dll
EXPORTS
_hello
В vc++ всё собирается как надо, но, чёрт побери, это не вариант.
Точно такое же поведение, если собирать gcc без extern "C". g++ без extern "C" подчеркивание оставляет, но при этом символ имеет примерно такой вид: _Z65hello, что тоже не вариант.
Здравствуйте, ek_, Вы писали:
ek_>Большущая просьба пособить с решением проблемы:
ek_>При сборке dll в gcc под виндой (3.4.2 mingw-special) в разделе экспорта в длл у функций имена пишутся без нижнего подчеркивания. А мне нужно, чтобы это нижнее подчеркивание было(длл потом подгружается из явы). -fleading-underscore не спасает ни в каком виде.
В function attributes есть такое:
`alias ("TARGET")'
The `alias' attribute causes the declaration to be emitted as an
alias for another symbol, which must be specified. For instance,
void __f () { /* Do something. */; }
void f () __attribute__ ((weak, alias ("__f")));
declares `f' to be a weak alias for `__f'. In C++, the mangled
name for the target must be used.
Not all target machines support this attribute.
не знаю, насколько это применимо к mingw, но попробовать можно.
ek_>говорим pexports dll.dll
ek_>ek_>LIBRARY dll.dll
ek_>EXPORTS
ek_>hello
ek_>
ek_>вот такое вот безобразие. мне же надо, чтобы было
ek_>ek_>LIBRARY dll.dll
ek_>EXPORTS
ek_>_hello
ek_>
ek_>В vc++ всё собирается как надо, но, чёрт побери, это не вариант.
А mingw понимает .def ? Если да, то прописать там.