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

C_DLL pulma

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 ?

6

293

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • C_DLL pulma

      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 ?

      • C_DLL pulma

        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 ?


      • CBuilder

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


      • Ohjekirjakäteen
        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.


    • dlp
    • csotkujakylläkin

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

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Voiko normaali ihminen ryhtyä vasemmistolaiseksi?

      Tätä jäin pohdiskelemaan.
      Maailman menoa
      202
      4248
    2. SDP haluaa 40 000 nettomaahanmuuttajaa

      SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah
      Maailman menoa
      146
      3798
    3. Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen

      No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat
      Maailman menoa
      136
      3245
    4. Hienoa! Eduskunta luopui käteisen käytöstä

      Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.
      Maailman menoa
      44
      1621
    5. Ikävä sinua mies

      Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i
      Ikävä
      19
      1498
    6. Mikä tämä henkilö mahtaa touhuta Parkanossa

      Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58
      Parkano
      34
      1440
    7. Sulla on avaimet ja keinot

      Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi
      Ikävä
      25
      1385
    8. Orpo loukkaantui fasismiin viittaavasta sanavalinnasta

      Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk
      Maailman menoa
      27
      1351
    9. Kiinnostaa - ei kiinnosta - kiinnostaapas

      Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt
      Sinkut
      116
      1150
    10. Martina haluaa Marbellaan

      Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust
      Kotimaiset julkkisjuorut
      215
      1063
    Aihe