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 ?
6345
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

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 ?

Äänestä
  • 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 ?

    Äänestä

  • "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.

    Äänestä

  • 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.

    Äänestä

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);

Äänestä

Kommentoi aloitusta


C_DLL pulma kirjoitti:

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 ?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu