| Thread overview | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 
 | 
| April 25, 2004Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| I've made a DLL with VC++ which contains two symbols:
DLL_API int value = 10;
DLL_API int *get_value_addr()
{
    return &value;
}
Then I used implib.exe to make a dll.lib for using with D.
Then I made the following D program to test access to DLL symbols:
import std.c.stdio;
extern(C) int value;
extern(C) int* get_value_addr();
int main(char[][] args)
{
     printf("value=%i\n", value);
     printf("addrof(value)=%p\n", &value);
     printf("get_value_addr=%p\n", get_value_addr());
     printf("*get_value_addr=%i\n", *get_value_addr());
     return 0;
}
The program output is:
value=0
addrof(value)=004130E0
get_value_addr=10006030
*get_value_addr=10
Which means that I can't access a C global variable from D; the function is accessed ok, but the global variable is not.
Is this a bug ? is there some option that I should pass at the compiler ?
I am trying to port the Allegro multimedia library to D. Allegro functions work ok, but Allegro global variables can't be accessed.
 | ||||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Achilleas Margaritis | "Achilleas Margaritis" <axilmar@in.gr> wrote in message news:c6gejo$1r7v$1@digitaldaemon.com... > I've made a DLL with VC++ which contains two symbols: > > DLL_API int value = 10; > > DLL_API int *get_value_addr() > { > return &value; > } > > Then I used implib.exe to make a dll.lib for using with D. > > Then I made the following D program to test access to DLL symbols: > > import std.c.stdio; > > extern(C) int value; > extern(C) int* get_value_addr(); > > int main(char[][] args) > { > printf("value=%i\n", value); > printf("addrof(value)=%p\n", &value); > printf("get_value_addr=%p\n", get_value_addr()); > printf("*get_value_addr=%i\n", *get_value_addr()); > return 0; > } > > The program output is: > > value=0 > addrof(value)=004130E0 > get_value_addr=10006030 > *get_value_addr=10 > > Which means that I can't access a C global variable from D; the function is accessed ok, but the global variable is not. I've *never* once seen a good reason to export data, rather than functions providing access to data, from a DLL. I recommend you change the design. (btw, for anyone who wants to tell me about exporting static class variables from DLLs, I acknowledge the technical feasibility of such things, but suggest that it's notionally a very bad idea still. basic_string::npos? No thanks!) | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Achilleas Margaritis | Achilleas Margaritis schrieb: > Which means that I can't access a C global variable from D; the function is > accessed ok, but the global variable is not. > > Is this a bug ? is there some option that I should pass at the compiler ? This is a principal limitation of DLLs. Variables don't get exported. > I am trying to port the Allegro multimedia library to D. Allegro functions > work ok, but Allegro global variables can't be accessed. Can you compile Allegro with DMC? If i remember correctly, Allegro is not designed to be linked dynamically. BTW, why Allegro and not libSDL, which was already ported by someone? -eye | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Matthew | 
> I've *never* once seen a good reason to export data, rather than functions providing access to data, from a DLL. I recommend you change the design.
>
I agree, but Allegro is not mine... It is a big library, which you can find it here:
www.allegro.cc
Do you know if exported data can be accessed from D ? if not, I would have to make an additional DLL with the functions which provide access to Allegro's global data.
 | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Ilya Minkov | > If i remember correctly, Allegro is not designed to be linked dynamically. Oh yes, it does. It comes in 2 flavors: dynamic, in form of DLL, and static. > > BTW, why Allegro and not libSDL, which was already ported by someone? SDL is not the same with Allegro: All SDL does is provide access to the framebuffer and mouse/keyboard input, whereas Allegro can do this and sound, 3d, gui, drawing routines, filesystem, compression, sprites, and lots of other things SDL does not do. | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Achilleas Margaritis | Why not link in with a C static lib, for which you write a D layer. (Look at recls for an example, albeit it's far larger than what you may need here, but it'll give you the general idea of mapping from another language.) "Achilleas Margaritis" <axilmar@in.gr> wrote in message news:c6gjms$233m$1@digitaldaemon.com... > > > I've *never* once seen a good reason to export data, rather than functions providing access to data, from a DLL. I recommend you change the design. > > > > I agree, but Allegro is not mine... It is a big library, which you can find it here: > > www.allegro.cc > > Do you know if exported data can be accessed from D ? if not, I would have to make an additional DLL with the functions which provide access to Allegro's global data. > > > | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Achilleas Margaritis | Achilleas Margaritis wrote: >>If i remember correctly, Allegro is not designed to be linked dynamically. >> >> > >Oh yes, it does. It comes in 2 flavors: dynamic, in form of DLL, and static. > > > >>BTW, why Allegro and not libSDL, which was already ported by someone? >> >> > >SDL is not the same with Allegro: All SDL does is provide access to the >framebuffer and mouse/keyboard input, whereas Allegro can do this and sound, >3d, gui, drawing routines, filesystem, compression, sprites, and lots of >other things SDL does not do. > > SDL can do sound and sprites and can link into openGL (3d) but not some of those other things. -- -Anderson: http://badmama.com.au/~anderson/ | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Matthew | "Matthew" <matthew.hat@stlsoft.dot.org> wrote in message news:c6glbu$25m6$1@digitaldaemon.com... > Why not link in with a C static lib, for which you write a D layer. (Look at > recls for an example, albeit it's far larger than what you may need here, but > it'll give you the general idea of mapping from another language.) > But D is supposed to interface directly with C. Anyway, a layer is not really needed: allegro is usable from D, except for global variables. I will have to write a short DLL with getters/setters of the global variables. | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Achilleas Margaritis | "Achilleas Margaritis" <axilmar@in.gr> wrote in message news:c6gejo$1r7v$1@digitaldaemon.com... > Which means that I can't access a C global variable from D; the function is > accessed ok, but the global variable is not. > > Is this a bug ? is there some option that I should pass at the compiler ? > > I am trying to port the Allegro multimedia library to D. Allegro functions work ok, but Allegro global variables can't be accessed. The problem is that, in D, a declaration is a definition. So int x; will declare and define x. The trick to referencing a C global variable is to make a module, let's say foo.d: ------------------- extern (C) int x; ------------------- And then in your code: ----------------------- import foo; ... and then refer to foo.x ... ----------------------- but do NOT link in foo.obj. You'll find this trick is used in std.c.stdio to refer to _iob[]. stdio.obj is NOT added to phobos.lib, and so the linker will look elsewhere for a definition of _iob[]. | |||
| April 25, 2004Re: Interfacing to C global variables ? | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Achilleas Margaritis | "Achilleas Margaritis" <axilmar@in.gr> wrote in message news:c6h151$2oao$1@digitaldaemon.com... > > "Matthew" <matthew.hat@stlsoft.dot.org> wrote in message news:c6glbu$25m6$1@digitaldaemon.com... > > Why not link in with a C static lib, for which you write a D layer. (Look > at > > recls for an example, albeit it's far larger than what you may need here, > but > > it'll give you the general idea of mapping from another language.) > > > > But D is supposed to interface directly with C. > > Anyway, a layer is not really needed: allegro is usable from D, except for global variables. I will have to write a short DLL with getters/setters of the global variables. I'm saying you don't need to have it as a DLL, just a bit of linked-in C. | |||
Copyright © 1999-2021 by the D Language Foundation
  Permalink
Permalink Reply
Reply