dll import? - eikö pitäisi olla export ???

Tässä on kyse lähdekoodista, jonka kääntämisen lopputuloksena syntyy DLL -tiedosto. Siis "libxxx.dll"

Ajoin gcc:n -E -optiolla, jotta näen, mitä varsinainen kääntäjä saa syötteekseen C-preprosessoinnin jälkeen.

YLLÄTYIN kovasti, kun tuloksena on tällaista:

__attribute__((__dllimport__)) extern const char * const __gmp_version;

Tuo siis ainoa/harvoja poikkeuksia, jossa exportoidaan dataa, yleensähän exportoidaan funktioita.

ja lisää (funktioita):

__attribute__((__dllimport__)) void __gmpz_add (mpz_ptr, mpz_srcptr, mpz_srcptr);

__attribute__((__dllimport__)) void __gmpz_add_ui (mpz_ptr, mpz_srcptr, unsigned long int);

---------------------
Yllä siis otteita tiedostosta preprocessed_only.txt, joka on tuotettu näin:

gcc -o preprocessed_only.txt -E oma_gmpinfo.c

Siis HÄH ?????

Eikös sen pitäisi olla niin, että noilla #define -lauseilla hoidetaan asia niin, että kun käännetään DLL, pitäisi (gcc -E ...) tuloksena olla dllexport, eikä dllimport ?

No ok, ehkä kyse on siitä, että alkuperäisessä käännöksessä make:n makefile tosiaan antaa kääntäjälle jonkun komentorivioption, jossa määritellään, että ollaan kääntämässä DLL -tiedostoa, ja tuon option olen vahingossa jättänyt antamatta omaa oma_gmpinfo.c -tiedostoa kääntäjälle prosessoitavaksi määrätessäni.

Miten saa selville, mitä komentorivilleni pitää lisätä, jotta myös oma_gmpinfo.c -tiedostoa käsitellään nimenomaan DLL -tiedoston lähdekoodina ?
Ilmianna
Jaa

6 Vastausta



noniin...

Keksinpä lisätä seuraavat rivit tiedoston gmp.h melkein alkuun:

#ifdef DLL
#define __GMP_LIBGMP_DLL
#define __GMP_WITHIN_GMP
#endif

Ja sitten ilmeisesti näin:

gcc -o preprocessed_only.txt -DDLL -E oma_gmpinfo.c

voi EI !

Tämä kokeilu johtaa varoituksiin ja virheilmoitukseen:

$ #gcc -o preprocessed_only.txt -E oma_gmpinfo.c
OK

$ gcc -o preprocessed_only.txt -DDLL -E oma_gmpinfo.c

In file included from oma_gmpinfo.c:6:
gmp.h:63:1: warning: "__GMP_LIBGMP_DLL" redefined
gmp.h:29:1: warning: this is the location of the previous definition
gmp.h:176:21: error: #if with no expression

$ gcc -o preprocessed_only.txt -E oma_gmpinfo.c
OK

$ gcc -o preprocessed_only.txt -D__GMP_LIBGMP_DLL -D__GMP_WITHIN_GMP -E oma_gmpinfo.c
OK

Mutta miksi ?

SIIS...

lisäsin tuon em:

#ifdef DLL
#define __GMP_LIBGMP_DLL
#define __GMP_WITHIN_GMP
#endif

gmp.h -tiedoston juuri siksi, että voisin tuottaa haluamani tekstitiedoston näin:

gcc -o preprocessed_only.txt -DDLL -E oma_gmpinfo.c

MUTTA ikävä kyllä jotain meni pieleen.

SENSIJAAN:

$ gcc -o preprocessed_only.txt -D__GMP_LIBGMP_DLL -D__GMP_WITHIN_GMP -E oma_gmpinfo.c

toimii OK.

Miksi siis ideani laittaa itse em. ifdef -lohko .h -tiedostoon, ja sitten komentoriviltä pelkkä -DDLL ei toimi, mutta kun manuaalisesti määrittelee nuo molemmat:

-D__GMP_LIBGMP_DLL -D__GMP_WITHIN_GMP

niin sitten toimii ?
Kommentoi
Ilmianna
Jaa
3 VASTAUSTA:
Jaahas...

gcc -o preprocessed_only2.txt -DDLL -E oma_gmpinfo.c

toimii sittenkin !

MUTTA:

tuo oma lisäys .h -tiedostoon pitää ollakin näin:
#ifdef DLL
#define __GMP_LIBGMP_DLL 1
#define __GMP_WITHIN_GMP 1
#endif

Eikä enää tule yhtään varoitusta tai virhettä !

Teknisesti kyse on siis #if ja #ifdef eroista.

Teknisessä mielessä asia on siis selvitetty.

Mutta jos joku gcc:n ja make:n (automaken?) kanssa tekemisissä ollut osaisi vielä kertoa:

Miksi noissa defineissä suositaan tuota #if helpomman #ifdef sijasta ?
Kommentoi
Ilmianna
Jaa
"Miksi noissa defineissä suositaan tuota #if helpomman #ifdef sijasta ?"

siksi, että helppokäyttöisyys ei OSS -maailmassa kiinnosta tekijöityä pätkääkään.

Jos paremman haluat, suosittelen "Embarcadero C++ Builder". Kääntää C:tä ja "C++":aa.
Kommentoi
Ilmianna
Jaa
C_DLL pulma kirjoitti:
Jaahas...

gcc -o preprocessed_only2.txt -DDLL -E oma_gmpinfo.c

toimii sittenkin !

MUTTA:

tuo oma lisäys .h -tiedostoon pitää ollakin näin:
#ifdef DLL
#define __GMP_LIBGMP_DLL 1
#define __GMP_WITHIN_GMP 1
#endif

Eikä enää tule yhtään varoitusta tai virhettä !

Teknisesti kyse on siis #if ja #ifdef eroista.

Teknisessä mielessä asia on siis selvitetty.

Mutta jos joku gcc:n ja make:n (automaken?) kanssa tekemisissä ollut osaisi vielä kertoa:

Miksi noissa defineissä suositaan tuota #if helpomman #ifdef sijasta ?
Kun tekee ohjelmaa, niin on hyvä tietää mitä tekee. Ja lukea kielen manuaalia riittävästi. Manuaalisa on selvitetty #if ja #ifdef erot.
Kommentoi
Ilmianna
Jaa
+Lisää kommentti
Ilmianna
Jaa
Joo juuri erittäin ikävän näköisiä juttuja, tässä on eräs määrittely C:llä tietysti, tarkoittaa funktion määrittelyä jossain järjestelmän ajurin sisällä, ja tuo PASCAL-tyyppinen parametrien määritys on erilainen, jolloin pinorekisteriä pitää muuttaa tuollaisella määrittelyllä:

typedef int(PASCAL *MYPROC_dword_dword)(unsigned long,unsigned long);
MYPROC_dword_dword MapPhysToLinear;

- Eli tuo funktio mappaa fyysisen muistin osoitteen lineaariseksi muistiosoitteeksi jotta se on sitten käytettävissä helposti.

Tämä toimii, ei tarvitse olla tuota PASCAL-tyyppistä pinorekisteriä funktiokutsussa, koska ei ole parametrejä lainkaan:

typedef int(__cdecl *MYPROC_void)(void);
Ilmianna
Jaa

Vastaa alkuperäiseen viestiin

dll import? - eikö pitäisi olla export ???

Tässä on kyse lähdekoodista, jonka kääntämisen lopputuloksena syntyy DLL -tiedosto. Siis "libxxx.dll"

Ajoin gcc:n -E -optiolla, jotta näen, mitä varsinainen kääntäjä saa syötteekseen C-preprosessoinnin jälkeen.

YLLÄTYIN kovasti, kun tuloksena on tällaista:

__attribute__((__dllimport__)) extern const char * const __gmp_version;

Tuo siis ainoa/harvoja poikkeuksia, jossa exportoidaan dataa, yleensähän exportoidaan funktioita.

ja lisää (funktioita):

__attribute__((__dllimport__)) void __gmpz_add (mpz_ptr, mpz_srcptr, mpz_srcptr);

__attribute__((__dllimport__)) void __gmpz_add_ui (mpz_ptr, mpz_srcptr, unsigned long int);

---------------------
Yllä siis otteita tiedostosta preprocessed_only.txt, joka on tuotettu näin:

gcc -o preprocessed_only.txt -E oma_gmpinfo.c

Siis HÄH ?????

Eikös sen pitäisi olla niin, että noilla #define -lauseilla hoidetaan asia niin, että kun käännetään DLL, pitäisi (gcc -E ...) tuloksena olla dllexport, eikä dllimport ?

No ok, ehkä kyse on siitä, että alkuperäisessä käännöksessä make:n makefile tosiaan antaa kääntäjälle jonkun komentorivioption, jossa määritellään, että ollaan kääntämässä DLL -tiedostoa, ja tuon option olen vahingossa jättänyt antamatta omaa oma_gmpinfo.c -tiedostoa kääntäjälle prosessoitavaksi määrätessäni.

Miten saa selville, mitä komentorivilleni pitää lisätä, jotta myös oma_gmpinfo.c -tiedostoa käsitellään nimenomaan DLL -tiedoston lähdekoodina ?

5000 merkkiä jäljellä

Peruuta