mingw-gcc / DLL

vain_exe_ja_yksi_dll_ok

Millaisella komennolla pitäisi kääntää (gcc windowsissa, eli mingw-gcc):

Haluan tuottaa DLL -kirjaston.

Mutta haluan, että tuon DLL -kirjaston tarvittavat osat linkitetään staattisesti tuohon DLL -kirjastoon, eli siis siten, että sovellus tarvitsee vain tuon yhden DLL -tiedoston (jota siis olen kääntämässä), mutta tuo DLL ei saa itse vaatia muita DLL -tiedostoja toimiakseen.

Yritin tätä:

C:\c_source>gcc -c test2d.c

C:\c_source>gcc -shared -o test2d.dll test2d.o

Kun sitten sovellusohjelmani yrittää käyttää em. kääntämisen tuloksena syntynyttä test2d.dll -kirjastoa, niin sovellus antaa tällaisen virheilmoituksen:

Sovellus.exe - System Error

The program can't start because libgcc_s_dw2-1.dll is missing from your computer.

Eli pitäisi saada tuotetuksi dynaaminen kirjasto test2d.dll, mutta siten, että tuo test2d.dll sisältää kaiken tarvitsemansa koodin, eli se ei saisi vaatia tuota libgcc_s_dw2-1.dll -kirjastoa toimiakseen, vaan kääntäjän pitäisi osata laittaa ne osat tuosta libgcc_s_dw2-1.dll:stä ( tai sen vastineesta, ehkäpä libgcc_s_dw2-1.a ) joita tuo test2d.dll tarvitsee, niin kääntäjän pitäisi osata sisällyttää ko. osat suoraan test2d.dll .tiedoston osiksi.

Tällöin sovellus tarvitsisi avukseen VAIN test2d.dll -kirjaston, ei muuta (niiden lisäksi, mitkä kuuluvat jokaiseen windowsiin, kuten user32.dll, kernel32.dll, advapi32.dll jne).

Mitä gcc -kääntäjälle pitäisi antaa parametriksi tuon -shared lisäksi, jotta kääntäjä, vaikka tuottaa dynaamisen kirjaston (DLL) niin sisällyttäisi staattisesti tuotettavaan DLL:ään kaikki tarvittavat osat niin, ettei synny muita ajonaikaisia riippuvuuksia ?

ps. Sovellus.exe ei tarvitse tuota libgcc_s_dw2-1.dll lainkaan, tästä olen 100% varma. Ainoastaan tuo test2d.dll tällä hetkellä tarvitsee tuon libgcc_s_dw2-1.dll -kirjaston toimiakseen, ja tästä riippuvuudesta haluan päästä eroon (vaikka se suurentaakin test2d.dll -kirjaston kokoa).

4

56

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • OSS_ei_pelkkää_hyvää

      Kokeilepa tätä:

      gcc -shared -static -o test2d.dll test2d.o

      harmi, että tätäkin on gcc:n dokumentaatiosta todella vaikeaa löytää.

      Mutta se kai kuuluu noiden Open Sourcejen periaatteisiin.

      Eli maksat aina: Jos valitset Microsoftin työvälineen, maksat rahall lisenssimaksua kääntäjästä.

      Open sourcena et maksa rahaa, mutta maksat turhautumisen ja heikkolaatuisen, puutteellisen ja/tai harhaanjohtavan dokumentoinnin muodossa.

      • "harmi, että tätäkin on gcc:n dokumentaatiosta todella vaikeaa löytää."

        Siis miten niin vaikea löytää?

        https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options

        Aivan helposti löytyy.

        "Open sourcena et maksa rahaa, mutta maksat turhautumisen ja heikkolaatuisen, puutteellisen ja/tai harhaanjohtavan dokumentoinnin muodossa."

        Ei tämä eroa mitenkään Microsoftin dokumentaatiosta:

        https://msdn.microsoft.com/en-us/library/19z1t1wy.aspx

        Siellä on vastaavalla tavalla linking options.

        Yritätkö siis sanoa, että maksamalla Microsoftille lisnssimaksua makaa myös turhautumisesta, heikkolaatuisesta, puutteellisesta ja harhaanjohtavasta dokumentaatiosta?


      • delphikoodaaja

        niin:

        gnu gcc:n dokumenteistä pitäisi siis erikseen aktivoida SEKÄ

        -shared

        että

        -static

        Veikkaanpa, että microsoftin kääntäjälle riittä yksi optio: tuota DLL exe:n sijasta.

        Eli MS kääntää tuskin edes yrittää oletuksena rakentaa sellaista DLL:ää, joka tarvitsee tukun muita DLL:iä toimiakseen.

        gcc:ssä taas on oletuksena tuo muiden DLL:ien vaatiminen, ja vain
        -static -optiolla tuon hölmön oletuksen saa kumottua.

        jotenkin sekava muutenkin tuo gcc:n systeemi.

        Kun -shared tarkoittaa tuon käännöksen lopputulosta (eli -shared = DLL, ilman ko. valitsinta exe).

        Ja -static taas pitäisi olla oletus, mutta jostain syystä oletuksena onkin lopputulos, joka ei toimi ilman apu-DLL-iä, ja vielä niiden osalta sijoitusta oikeaan hakemistoon ja/tai path -ympäristömuuttujan käpistelyä yms.

        Eli siis maksullisissa kääntäjissä yleensä oletukset ovat järkeviä, ei tarvitse etsiä mistä löytyis dokumentaatio , ja maksullisissa dokumentaation vaan on selkeämmin tehty.

        Microsoft -hypetystä?

        no EI!

        esim. Delphissä asia on todella helppo:

        jos lähdekoodimoduli alkaa:

        program Ohjelma;

        niin syntyy Ohjelma.exe

        ja jos lähdekoodimoduli alkaa:

        library Kirjasto;

        niin syntyy Kirjasto.dll

        ei tarvitse yhtään kääntäjäoptiota kiraston tuottamiseen !

        Ja oletuksena Delphi ei koskaan tee ns. vajaata EXEä tai DLL:ää (siis sellaista, joka tarvitsee apu -DLL:iä toimiakseen).

        Toki Delphissäkin saa (esim. Delphi 7) tehtyä normaalia pienikokoisemman EXE:n tai DLL:n, jos erikseen määrittää, että sovellus tai kirjasto tarvitsee myös VCLD70.DLL toimiakseen.

        Mutta tuollainen ns. pikku-EXE:n (tai pikku-DLL:n) tuottaminen on Delphissä poikkeustapaus, joka pitää erikseen aktivoida käyttöön jos tuollaisen haluaa. Oletuksena Delphi ei tee moista hälmöilyä.

        Olen itsekin käyttänyt tuollaisen pikku-EXE:n tuottamisoptiota Delphillä, mutta siinä oli kyse ihan siitä, että ohjelman tuotantovaiheessa piti toimittaa uusia versioita asiakkaan luona koekäytettäväksi, ja kun 1990 -luvulla oli vielä sähkäpostin lähetyksessä nettiyhteytenä 33600 bps modeemi, niin oli eduksi lähettää pienikokoinen EXE. Toki tähän piti varautua asentamalla ko. koneelle tuo em. VCLD50.DLL (niin, 50 = Delphi 5, 70 =Delphi 7).

        Mutta oletuksena on typerää tuottaa tuollaista ns. vajaata EXEä tai vajaata DLL:ää, joka vaatii aputiedostoja toimiakseen.

        Oikein tehdyssä kääntäjässä pitäisi aina olla oletus se, että tuotetaan ns. täysi exe tai dll, jos ei käännösvaiheessa toisin määrätä.

        Mutta gcc:n maailmaan tuntuu kuuluvan tietynlainen nihilismi, jossa asiat tarkoituksella tehdään vaikeiksi laittamalla oletus niin päin, että apu-DLLiä tarvitaan, kun oletus pitäisi olla se, että niitä ei tarvita.


      • delphikoodaaja kirjoitti:

        niin:

        gnu gcc:n dokumenteistä pitäisi siis erikseen aktivoida SEKÄ

        -shared

        että

        -static

        Veikkaanpa, että microsoftin kääntäjälle riittä yksi optio: tuota DLL exe:n sijasta.

        Eli MS kääntää tuskin edes yrittää oletuksena rakentaa sellaista DLL:ää, joka tarvitsee tukun muita DLL:iä toimiakseen.

        gcc:ssä taas on oletuksena tuo muiden DLL:ien vaatiminen, ja vain
        -static -optiolla tuon hölmön oletuksen saa kumottua.

        jotenkin sekava muutenkin tuo gcc:n systeemi.

        Kun -shared tarkoittaa tuon käännöksen lopputulosta (eli -shared = DLL, ilman ko. valitsinta exe).

        Ja -static taas pitäisi olla oletus, mutta jostain syystä oletuksena onkin lopputulos, joka ei toimi ilman apu-DLL-iä, ja vielä niiden osalta sijoitusta oikeaan hakemistoon ja/tai path -ympäristömuuttujan käpistelyä yms.

        Eli siis maksullisissa kääntäjissä yleensä oletukset ovat järkeviä, ei tarvitse etsiä mistä löytyis dokumentaatio , ja maksullisissa dokumentaation vaan on selkeämmin tehty.

        Microsoft -hypetystä?

        no EI!

        esim. Delphissä asia on todella helppo:

        jos lähdekoodimoduli alkaa:

        program Ohjelma;

        niin syntyy Ohjelma.exe

        ja jos lähdekoodimoduli alkaa:

        library Kirjasto;

        niin syntyy Kirjasto.dll

        ei tarvitse yhtään kääntäjäoptiota kiraston tuottamiseen !

        Ja oletuksena Delphi ei koskaan tee ns. vajaata EXEä tai DLL:ää (siis sellaista, joka tarvitsee apu -DLL:iä toimiakseen).

        Toki Delphissäkin saa (esim. Delphi 7) tehtyä normaalia pienikokoisemman EXE:n tai DLL:n, jos erikseen määrittää, että sovellus tai kirjasto tarvitsee myös VCLD70.DLL toimiakseen.

        Mutta tuollainen ns. pikku-EXE:n (tai pikku-DLL:n) tuottaminen on Delphissä poikkeustapaus, joka pitää erikseen aktivoida käyttöön jos tuollaisen haluaa. Oletuksena Delphi ei tee moista hälmöilyä.

        Olen itsekin käyttänyt tuollaisen pikku-EXE:n tuottamisoptiota Delphillä, mutta siinä oli kyse ihan siitä, että ohjelman tuotantovaiheessa piti toimittaa uusia versioita asiakkaan luona koekäytettäväksi, ja kun 1990 -luvulla oli vielä sähkäpostin lähetyksessä nettiyhteytenä 33600 bps modeemi, niin oli eduksi lähettää pienikokoinen EXE. Toki tähän piti varautua asentamalla ko. koneelle tuo em. VCLD50.DLL (niin, 50 = Delphi 5, 70 =Delphi 7).

        Mutta oletuksena on typerää tuottaa tuollaista ns. vajaata EXEä tai vajaata DLL:ää, joka vaatii aputiedostoja toimiakseen.

        Oikein tehdyssä kääntäjässä pitäisi aina olla oletus se, että tuotetaan ns. täysi exe tai dll, jos ei käännösvaiheessa toisin määrätä.

        Mutta gcc:n maailmaan tuntuu kuuluvan tietynlainen nihilismi, jossa asiat tarkoituksella tehdään vaikeiksi laittamalla oletus niin päin, että apu-DLLiä tarvitaan, kun oletus pitäisi olla se, että niitä ei tarvita.

        "gnu gcc:n dokumenteistä pitäisi siis erikseen aktivoida SEKÄ

        -shared

        että

        -static"

        Niin? Siellä ohjeessahan selvästi lukee mitä ne vivut tekee.

        "gcc:ssä taas on oletuksena tuo muiden DLL:ien vaatiminen, ja vain "

        Ihan järkevä oletus se on kun:
        1. Normaalisti kirjastot ovat käyttöjärjestelmässä valmiina ja koodia jaetaan koko järjestelmän laajuisesti.
        2. Samassa paketissa voi olla useita ajettavia ohjelmia jolloin koodia jaetaan näiden ohjelmien kesken.
        3. Joidenkin kirjastojen lisensointi voi kieltää staattisen linkkaamisen.

        "Ja -static taas pitäisi olla oletus"

        Ei tosiaankaan! Sehän tekee bloattia kun dynaamisella linkkauksella käytetään samaa kirjastoa järjestelmän laajuisesti. Sehän ei johdu mitenkään GCC:stä, että Windowsissa ei niitä kirjastoja ole.

        "mutta jostain syystä oletuksena onkin lopputulos, joka ei toimi ilman apu-DLL-iä, ja vielä niiden osalta sijoitusta oikeaan hakemistoon ja/tai path -ympäristömuuttujan käpistelyä yms."

        Ei tämä ole mikään GCC:n vika vaan Windowsiin liittyvä asia. Windowsissa kun ei ole niitä kirjastoja mitä normaalisti on vakiona ja Windowsissa kansiorakenteessa ei myöskään ole sitä kirjastoille tarkoitettua vakiokansiota mihin ne asennetaan. GCC:ssä kun ei ole rajoitteita käyttöjärjestelmän suhteen.

        "esim. Delphissä asia on todella helppo:"

        Delphi on IDE, ei kääntäjä. Delphissä ei ole mitään kummallista helppoutta mihinkään muuhun IDE:n nähden.

        "Mutta oletuksena on typerää tuottaa tuollaista ns. vajaata EXEä tai vajaata DLL:ää, joka vaatii aputiedostoja toimiakseen."

        Se aputiedostojen tarve liittyy Windowsiin mistä puuttuu vaikka se VCLD70.DLL Windows kun perinteisesti ollut sellainen, että siihen asennetaan milloin mitäkin VBRUN, Visual C runtime, DirectX, Java jne. härpäkettä joita päivitetty ja ylläpidetty erikseen ja sitten ne ajettavat sovellukset lisäksi.


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

    Luetuimmat keskustelut

    1. Mielessäni vieläkin T

      Harmi että siinä kävi niinkuin kävi, rakastin sinua. Toivotan sulle kaikkea hyvää. Toivottavasti löydät sopivan ja hyvän
      Ikävä
      37
      1575
    2. Nellietä Emmaa ja Amandaa stressaa

      Ukkii minnuu Emmaa ja Amandaa stressaa ihan sikana joten voidaanko me koko kolmikko hypätä ukin kainaloon ja syleilyyn k
      Isovanhempien jutut
      6
      1331
    3. Nähtäiskö ylihuomenna taas siellä missä viimeksikin?

      Otetaan ruokaöljyä, banaaneita ja tuorekurkkuja sinne messiin. Tehdään taas sitä meidän salakivaa.
      Ikävä
      1
      1275
    4. Ei luottoa lakko maahan

      Patria menetti sovitun ksupan.
      Suomen Keskusta
      8
      1267
    5. Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita

      Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita – neljä Jyväskylän Outlaws MC:n jäsentä vangittu: "Määrät p
      Jyväskylä
      41
      1248
    6. Persut petti kannattajansa, totaalisesti !

      Peraujen fundamentalisteille, vaihtkaa saittia. Muille, näin sen näimme. On helppo luvata kehareille, eikä ne ymmärrä,
      Maailman menoa
      4
      1243
    7. Sinäkö se olit...

      Vai olitko? Jostain kumman syystä katse venyi.. Ajelin sitten miten sattuu ja sanoin ääneen siinä se nyt meni😅😅... Lis
      Ikävä
      0
      1224
    8. Housuvaippojen käyttö Suomi vs Ulkomaat

      Suomessa housuvaippoja aletaan käyttämään vauvoilla heti, kun ne alkavat ryömiä. Tuntuu, että ulkomailla housuvaippoihin
      Vaipat
      1
      1200
    9. Hyvää yötä ja kauniita unia!

      Täytyy alkaa taas nukkumaan, että jaksaa taas tämän päivän haasteet. Aikainen tipu madon löytää, vai miten se ärsyttävä
      Tunteet
      2
      1170
    10. Lepakot ja lepakkopönttö

      Ajattelin tehdä lepakkopöntön. Tietääkö joku ovatko lepakot talvella lepakkopöntössä ´vai jossain muualla nukkumassa ta
      1
      1146
    Aihe