g++ und Bibliotheken - Kommandozeilenparameter unter Windows (MinGW)



  • Windows 7 64bit, g++ 4.5.2

    Erste Wunderlichkeit:
    Eine Bibliothek dynamisch zu verlinken kann, so heißt es, implizit oder explizit geschehen.
    Zu Letzterem braucht es Veränderungen im Quellcode des Zielprogrammes, zu Ersterem braucht es angeblich dreierlei:
    - Header-Datei der Bibliothek
    - (statische) Import-Bibliothek
    - dynamische Bibliothek

    So gelesen an mehreren Stellen im Netz, Fachbuchauszügen, etc...
    Nun erkläre man mir mal, wieso das hier funktioniert:

    g++ -shared -o Zubehoer.dll Zubehoer.cpp
    g++ -L. -o Pufferueberlauf Pufferueberlauf.cpp -lZubehoer
    

    Wie man sieht, fehlt mir eine der Grundvoraussetzungen, die Import-Bibliothek.
    Nun dachte ich mir, dass ich vielleicht diese dynamische Bibliothek statisch gelinkt hätte - aber wenn ich die Datei lösche, lässt sich das Programm anschließend nicht mehr starten;
    nach Neuerstellung (nur) der Bibliothek geht es wieder - dynamisch gelinkt ist es also.
    ...
    Sind diese ganzen Anleitungen schlicht veraltet?
    Liegt es an einer versteckten Dienstleistung von MinGW?

    Zweite Wunderlichkeit:
    Nun erstellt die Zeile "g++ -shared -o <Name>.dll <Quellen>" also eine dynamische Bibliothek... wie wird daraus aber wohl eine statische?
    Das "-shared" einfach wegzulassen, ist nicht der rechte Weg - dann beschwert sich... der Linker ist es wohl; über den fehlenden Einsprungspunkt für Main...
    was ja nicht verwunderlich ist, weil es keine solche Funktion in der Quelle gibt (und für eine Bibliothek auch nicht geben muss, wie ich annehme).

    Nachtrag:
    Für den Fall, dass Wunderlichkeit eins mit irgendwelchen Besonderheiten im Quelltext zusammenhängt, hier ist derselbe.
    ... Mmh, dieses Forum unterstützt keine [spoiler][/spoiler], wie ärgerlich.

    Zubehoer.h

    #ifndef ZUBEHOER_H
    #define ZUBEHOER_H
    
    char * bits(const char wert);
    char * bits(const char werte[], unsigned int von, unsigned int bis);
    char * bits(const char werte[], unsigned int laenge);
    
    #endif
    

    Zubehoer.cpp

    #include "Zubehoer.h"
    
    char * bits(const char wert)
    {
      char * bitfolge = new char[sizeof(char) * 8 + 1];
      char temp;
    
      for(unsigned char z = 0; z < sizeof(char) * 8; z++)
      {
        temp = wert << z;
        temp = temp >> (sizeof(char) * 8 - 1);
        temp ? bitfolge[z] = '1' : bitfolge[z] = '0';
      }
      bitfolge[sizeof(char) * 8] = 0;
    
      return bitfolge;
    }
    
    char * bits(const char werte[], unsigned int von, unsigned int bis)
    {
      char * bitfolge = new char[sizeof(char) * 9 * (bis - von) + 1];
    
      for(unsigned char zA = 0; zA < (bis - von); zA++)
      {
        char * temp = bits(werte[zA + von]);
        for(unsigned char zB = 0; zB < sizeof(char) * 8; zB++)
        {
          bitfolge[zA * sizeof(char) * 9 + zB] = temp[zB];
        }
        bitfolge[zA * sizeof(char) * 9 + sizeof(char) * 8] = ' ';
        delete(temp);
      }
      bitfolge[sizeof(char) * 9 * (bis - von)] = 0;
    
      delete(werte);
    
      return bitfolge;
    }
    
    char * bits(const char werte[], unsigned int laenge)
    {
      return bits(werte, 0, laenge);
    }
    

    Pufferueberlauf.cpp

    #include <iostream>
    #include <string>
    
    #include "Zubehoer.h"
    
    #define LAENGE 4
    
    using namespace std;
    
    struct struktur
    {
      char puffer[LAENGE];
      char buchstabe;
    };
    
    int main()
    {
      struct struktur beispiel;
      beispiel.puffer[0] = 'b'; beispiel.puffer[1] = 'l'; beispiel.puffer[2] = 'a'; beispiel.puffer[3] = 0;
      beispiel.buchstabe = 'z';
    
      cout << endl;
      cout << "Puffer:\t\t" << beispiel.puffer << endl;
      cout << "Buchstabe:\t" << beispiel.buchstabe << endl << endl;
    
      cout << "Fuelle Puffer mit \"";
      char nullen[LAENGE + 1];
      for(unsigned int z = 0; z < LAENGE + 1; z++)
      {
        cout << "0";
        nullen[z] = '0';
      }
      cout << "\"" << endl;
      cout << "       Bitweise: " << bits(nullen, LAENGE + 1) << endl;
      cout << "Puffer bitweise: ";
      for(unsigned int z = 0; z < LAENGE; z++)
      {
        cout << bits(beispiel.puffer[z]) << " ";
      }
      cout << endl << endl;
    
      for(unsigned int z = 0; z < LAENGE + 1; z++)
      {
        beispiel.puffer[z] = '0';
        cout << beispiel.puffer << endl;
      }
      cout << endl;
    
      cout << "Puffer:\t\t" << beispiel.puffer << endl;
      cout << "Buchstabe:\t" << beispiel.buchstabe << endl;
    }
    

Log in to reply