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

102

    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. Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa

      En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod
      Ikävä
      22
      5144
    2. Huomenta ihana

      Kauniskasvoinen ihanuus 😘 saan sut vielä
      Ikävä
      25
      4328
    3. Hei rakas...

      Miten on työpäivä sujunut? Rakastan sinua 💗
      Ikävä
      27
      2461
    4. Edelleen sitä on vaikea uskoa

      Että olisit oikeasti rakastunut muhun
      Ikävä
      34
      2244
    5. Toiveikas vai toivoton

      torstai? Ajatuksia?
      Ikävä
      37
      1998
    6. Vitsi mihin menit. Heti takasin.

      Mä näin sut tuu takasin! Oli kiire, niin en ehtiny sin perään!
      Ikävä
      15
      1908
    7. En ole koskaan kokenut

      Ennen mitään tällaista rakastumista. Tiedän että kaipaan sinua varmaan loppu elämän. Toivottavasti ei tarvitsisi vain ka
      Ikävä
      19
      1587
    8. Mukavaa päivää

      Mun rakkauden kohteelle ❤️ toivottavasti olet onnellinen
      Ikävä
      12
      1521
    9. Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...

      Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons
      Suomalaiset julkkikset
      21
      1247
    10. Kerranki asiat oikein

      Ilkka ja muut pienpuolueeet...teitte hyvän työn kun valitsitte pätevän henkilön virkaan eikä kepulle passelia!! Jatkakaa
      Haapavesi
      10
      1174
    Aihe