Brauche Hilfe mit C: Compilerfehler

  • Hi, ich brauch mal Hilfe beim Compilieren....


    Wie haben uns mal nen NativeTreiber für Java geschnitzt, für MySQL.


    Konnte ich vor einem Jahr noch compilieren, damals noch unter gcc2.9x, nun aber auf meiner Gentoo mit gcc3.2 knallts.


    Leider hab ich mit C nicht genug am Hut dass ich sagen könnte was verkehrt läuft :(


    Kann mir einer weiterhelfen?


    Hier der Code:



    Sorry ist lang...
    Da wo SCHNIPP steht hab ich was rausgeschnitten, das scheint zu gehen.



    Und hier der Fehler:




    Irgendwas am __cdecl oder __int64 oder was auch immer passt Ihm nicht, die Fehler kommen jedenfalls in diesen Deklarationen/Methoden :(


    Danke für Eure Hilfe :)

  • Hi Thomas,


    Zitat

    Irgendwas am __cdecl oder __int64 oder was auch immer passt Ihm nicht, die Fehler kommen jedenfalls in diesen Deklarationen/Methoden


    Ja. das hast du doch gefunden :D
    Bei dir fehlen die "include" einträge dazu.
    versuch in *.h nach defenitionen zu suchen.


    Gruß,
    genka

  • Naja schon, es wundert mich halt nur.


    __int64 lässt sich laut den GCC-Heinzen durch "long long int" ersetzen - OK.


    Aber __cdecl ist ANSI-C und sollte gehen.


    Naja egal, auch rauskommentiert, dann kompiliert er weiter.


    Bleibt aber stehen bei:


    Code
    NativeMySQL.cpp: In function `double atofown(const char*, int)':
    NativeMySQL.cpp:409: `_fltin' undeclared (first use this function)
    NativeMySQL.cpp:409: (Each undeclared identifier is reported only once for each
       function it appears in.)


    Komisch... der alte Compiler kannte das noch...

  • Hallo,


    Zitat

    Aber __cdecl ist ANSI-C und sollte gehen.


    ist in ANSI-C, aber dazu gibt es definition in H-File.


    Zitat

    NativeMySQL.cpp:409: `_fltin' undeclared (first use this function)


    genau so - die *.h durchsuchen und mit "include" angeben. (und/oder library installieren, weil ich das nur unter win gefunden habe)


    Zitat

    Komisch... der alte Compiler kannte das noch...


    der Compiler ist OK, es sind einfach verschiedene einstellungen.
    vielleicht wurde default-include-set geändert, oder noch was :D


    Gruß,
    genka

  • Hallo Thomas,


    Zitat


    warum kommentierst Du denn die Includes aus, die Deine Anwendung offensichtlich benötigt, vor allem fltintrn.h für _flt, _fltin, _fltin2 ...? Weil sie Dein Compiler nicht findet. Und warum findet er sie nicht?
    Weil es Include-Files vom Microsoft Visual C/C++ Compiler sind, die nicht auf Deinem System installiert sind. Hattest Du damals unter gcc2.9x vielleicht noch weitere Includes, die Du heute nicht mehr hast?


    Grüße
    Markus

    yaVDR 0.5.0a
    DD Cine S2 V6.5 & DuoFlex S2, ASRock B75 PRO3, NVidia GT610-SL, Core i3-2120T, 4GB, 60GB SSD, 1.5TB
    Samsung UE46F8090, Sony STR-DB780, 5.0 surround A.C.T. speaker

  • Zitat

    Original von mark2
    warum kommentierst Du denn die Includes aus, die Deine Anwendung offensichtlich benötigt, vor allem fltintrn.h für _flt, _fltin, _fltin2 ...? Weil sie Dein Compiler nicht findet. Und warum findet er sie nicht?
    Weil es Include-Files vom Microsoft Visual C/C++ Compiler sind, die nicht auf Deinem System installiert sind.


    Stimme auffallend :D
    Wurde damals auch auf ner Windoze programmiert, ich hab's nur nach Linux portiert.
    Deswegen ist ja z.B. windows.h auskommentiert ;)


    Zitat


    Hattest Du damals unter gcc2.9x vielleicht noch weitere Includes, die Du heute nicht mehr hast?


    Kaum.
    Meine alte Installation ist noch eingemountet und ich hab eine Volltextsuche auch darüber fahren lassen.
    Deswegen wundert es mich ja so, wenn das irgendwo existieren würde hätte ich es schon gefunden.

  • Hallo Thomas,


    Zitat

    Wurde damals auch auf ner Windoze programmiert, ich hab's nur nach Linux portiert.
    Deswegen ist ja z.B. windows.h auskommentiert ;)


    wenn Du Windows-Code nach Linux portierst, solltest Du auch Ersatz für die Funktionen und Defintionen sorgen, die es unter Linux nicht gibt. Wenn Du in den Headern auf Deinem System z.B. keinen Prototyp für die Funktion "_fltin" findest, gibt es dort diese Funktion auch nicht in den Libraries. Also mußt Du ihre Deklaration, die von ihr verwendeten Datenstrukturen und ihre Implementierung unter Linux nachbauen.
    Wenn sich diese Anwendung damals unter Linux compilieren lies, dann hattest Du all diese Dinge bereits (waren vielleicht beim Compiler dabei?), heute aber offensichtlich nicht mehr.


    Grüsse
    Markus

    yaVDR 0.5.0a
    DD Cine S2 V6.5 & DuoFlex S2, ASRock B75 PRO3, NVidia GT610-SL, Core i3-2120T, 4GB, 60GB SSD, 1.5TB
    Samsung UE46F8090, Sony STR-DB780, 5.0 surround A.C.T. speaker

  • Hallo Thomas,


    noch was:


    Zitat

    Meine alte Installation ist noch eingemountet und ich hab eine Volltextsuche auch darüber fahren lassen.
    Deswegen wundert es mich ja so, wenn das irgendwo existieren würde hätte ich es schon gefunden.


    die beiden Header cruntime.h und fltintrn.h finden sich bei mir hier unter
    C:\Programme\Microsoft Visual Studio\VC98\CRT\SRC


    Ein Auszug aus fltintrn.h:


    Der Define "_MT" stammt von der Option "/MT" des Microsoft Visual C++ Compilers. Wegen des Multi-Threadings solltest Du Dir unter Linux evtl. auch Gedanken machen, ob Dein native Treiber nach der Portierung noch damit umgehen kann (thread safe ist).


    Grüße
    Markus

    yaVDR 0.5.0a
    DD Cine S2 V6.5 & DuoFlex S2, ASRock B75 PRO3, NVidia GT610-SL, Core i3-2120T, 4GB, 60GB SSD, 1.5TB
    Samsung UE46F8090, Sony STR-DB780, 5.0 surround A.C.T. speaker

  • ...und genau da sind wir beim Problem.


    Warum konnte ein RedHat-2.9x das compilieren und ein Gentoo 3.2 nicht?


    Modofiziert an den Compilern hatte ich jedenfalls nichts.


    Kernproblem ist aber eigentlich nicht dass der Treiber nicht compilieren mag, sonder dass der alte nicht mehr unter der Gentoo läuft:


    Code
    Exception in thread "main" java.lang.UnsatisfiedLinkError: createConnection
            at NativeConnection.createConnection(Native Method)
            at NativeConnection.<init>(NativeConnection.java:34)
            at DbConvert.main(DbConvert.java:50)



    Ich wollte das halt durch Neucompilieren lösen, wenn der Alte ginge wäre ich aber auch zufrieden :)


    Edit:
    Whups, warste schneller als ich mit der Antwort :)

  • Zitat

    Original von mark2


    Der Define "_MT" stammt von der Option "/MT" des Microsoft Visual C++ Compilers. Wegen des Multi-Threadings solltest Du Dir unter Linux evtl. auch Gedanken machen, ob Dein native Treiber nach der Portierung noch damit umgehen kann (thread safe ist).


    Muss es nicht, es soll nur eine einmalige DB-Konvertierung stattfinden.
    Der Nativetreiber hatte Umlaute anders behandelt als der JDBC-Treiber von MySQL (den wir jetzt verwenden), es kommt daher viel Schrott raus.
    Ich wollte den alten Treiber daher nochmal kurz aus der Versenkung holen, die Inhalte auslesen und im gleichen Zug mit dem JDBC-Treiber wieder reinschreiben damit ich das Umlautproblem loswerde.


    Jaja, "mal eben schnell", da bin ich nun auch schon seit Freitag drüber ...

  • Hallo Thomas,


    Zitat
    Code
    Exception in thread "main" java.lang.UnsatisfiedLinkError: createConnection
            at NativeConnection.createConnection(Native Method)
            at NativeConnection.<init>(NativeConnection.java:34)
            at DbConvert.main(DbConvert.java:50)


    Die JVM findet eine native-deklarierte Methode nicht (UnsatisfiedLinkError). Sie findet also in den Shared Libraries Deiner Gentoo-Installation gewisse Funktionen nicht. Ich tippe auf die Funktionen, die in den Windows-Headern cruntime.h und fltintrn.h deklariert sind. Dein Treiber referenziert sie, der Linux-Runtime-Linker findet sie nicht und die JVM gibt obigen Fehler aus.


    Was Du brauchst, damit der alte Treiber noch funktioniert, wären die Shared Libraries, die diese Funktionen enthalten. Oder eben die Header und Libraries zum Compilieren. Vielleicht gibt's ja irgendwo ein Package mit dieser C-Runtime (CRT) zum Installieren, also sowas wie z.B. libcrt-6.3.2.0.rpm oder libcrt-6.3.2.0-devel.rpm, weiß nicht.


    Zitat

    Der Nativetreiber hatte Umlaute anders behandelt als der JDBC-Treiber von MySQL (den wir jetzt verwenden), es kommt daher viel Schrott raus.
    Ich wollte den alten Treiber daher nochmal kurz aus der Versenkung holen, die Inhalte auslesen und im gleichen Zug mit dem JDBC-Treiber wieder reinschreiben damit ich das Umlautproblem loswerde.


    Codepage-Probleme lassen sich mit dem Environment NLS_LANG (z.B. NLS_LANG = GERMAN_GERMANY.WE8ISO8859P1) oder einer DB-proprietären Codepage-Einstellung lösen. ISO8859P1 ist die Codepage fuer Westeuropa. Sie ist z.B. der Windows-1252 recht ähnlich. IBM-850 wäre eine weitere Codepage. Bei IBM-850 (wird z.B. in der DOS-Box von WinNT verwendet) liegen die Umlaute aber an völlig anderer Stelle als bei Windows-1252 (wird vom WinNT-GUI verwendet). WinNT verwendet also zwei Codepages gleichzeitig. Umlaute, die im Notepad eingetippt wurden, lassen sich deshalb in der DOS-Box nicht darstellen (und umgekehrt).
    Allen dreien gemeinsam ist die Position der Zeichen zwischen Byte-Wert 0 und 127 (ASCII). Ein "A" liegt also immer an Position 65. Bei den Byte-Werten > 127 ist es meist anders.


    Entweder der DB-Treiber oder das DBMS muss die von der DB kommenden Text-Daten in der Codepage des Clients liefern. Dazu werden die Text-Daten, wenn nötig, von der einen in die andere Codepage konvertiert. Damit das sauber funktioniert, müssen dieselben Daten aber ersteinmal mit der korrekten Codepage-Einstellung in die DB gelangt sein. Das DBMS speichert alle Text-Daten in derselben Codepage-Einstellung (kann man nur bei der Installation der DB einstellen und nicht mehr während des laufenden Betriebs ändern). Ein Datestrom vom Client zur DB wird von der Codepage des Client in die Codepage der DB konvertiert. Umgekehrt auch. So wird sichergestellt, daß nicht von jeder Codepage in jede andere konvertiert gekonnt werden muß, sondern immer nur von jeder Coderpage zur intern verwendeten und wieder zurück. Statt 50x50 Codepage-Konvertierungstabellen braucht es dann nur noch 50x1.
    Würde man z.B. mit der Codepage-Einstellung IS8859-1 einen Text, der in der Codepage IBM-850 vorliegt, in die DB inserten, bekäme man ihn z.B. mit der eingestellten Codepage Windows-1252 nicht mehr 1:1 heraus. Die Zeichen >127 (u.a. Umlaute) wären überwiegend falsch codiert. Man könnte nur noch die Codepage ISO8859-1 am DB-Client verwenden, um die Umlaute noch korrekt zu erhalten.


    Grüße
    Markus

    yaVDR 0.5.0a
    DD Cine S2 V6.5 & DuoFlex S2, ASRock B75 PRO3, NVidia GT610-SL, Core i3-2120T, 4GB, 60GB SSD, 1.5TB
    Samsung UE46F8090, Sony STR-DB780, 5.0 surround A.C.T. speaker

  • Der Vollständigkeit halber:
    Danke dass Du Dir so viel Mühe gibst mit meinem Problem :)


    Was Du erklärt hast war mir aber leider so schon bekannt, deswegen bin ich ja so verwirrt.
    Hab Tage damit verbracht verschiedene CodePages durchzuprobieren :D


    In der Datenbank steht z.B. Folgendes:

    Code
    �berprüfung, ob die Datumsangaben korrekt sind


    Die Umlaute sind hier totaler Schrott, und offenbar auch zwei Byte - da ist wohl der Unicode oder sonstwas verballert worden :(
    Bei der Umstellung hat sich übrigens die Codepage nicht geändert, weder Server- noch Clientseitig!


    Der Gag ist nun dass der Native-Treiber damit was anfangen kann, der JDBC-Treiber aber nicht.

  • Ich vergess das lieber mal mit dem Neucompilieren.


    Statt dessen wäre es wohl besser auf ner RH eine Library zu erzeugen, die komplett statisch gelinkt ist, sprich, in der alles drin ist was ich jemals brauchen könnte.


    Nur: wie mach ich das? Ich komm mit dem gcc ned zurecht: :(


    Code
    gcc -static -o libNativeMySQL.so NativeMySQL.o dateinfo.o -Llibraries -lmysqlclient
    /usr/bin/ld: cannot find -lmysqlclient
    collect2: ld returned 1 exit status


    Ohne die Option -static kann er linken, aber es wird ein Executable :(


    Kann mir einer einen Hinweis geben wie ich statisch gelinkte Libraries baue?

  • Hallo Thomas,


    Zitat
    Code
    gcc -static -o libNativeMySQL.so NativeMySQL.o dateinfo.o -Llibraries -lmysqlclient
    /usr/bin/ld: cannot find -lmysqlclient
    collect2: ld returned 1 exit status


    Ohne die Option -static kann er linken, aber es wird ein Executable :(


    Kann mir einer einen Hinweis geben wie ich statisch gelinkte Libraries baue?


    Stimmt denn der bei "-L" angegebene Pfad "libraries" zu den lib*.so und lib*.a Files?


    Wenn mit "-static" obige Fehlemeldung kommt, fehlt vermutlich die Static Library "libmysqlclient.a", oder der Pfad bei "-L" stimmt nicht. Man kann "-L" mehrfach angeben. Ohne "-static" wird der Linker die Shared Library "libmysqlclient.so" verwenden.


    Wenn Du eine Shared Library bauen willst, solltest Du das dem Linker auch mit "-shared" mitteilen. Sonst baut er halt ein normales Binary.


    Gruesse
    Markus

    yaVDR 0.5.0a
    DD Cine S2 V6.5 & DuoFlex S2, ASRock B75 PRO3, NVidia GT610-SL, Core i3-2120T, 4GB, 60GB SSD, 1.5TB
    Samsung UE46F8090, Sony STR-DB780, 5.0 surround A.C.T. speaker

  • .....ich schon wieder.


    Hab eine neuere Version des Treibers in unseren Archiven gefunden, diese compiliert problemlos :) :)


    Nun hab ich ein anderes Problem:


    Code
    Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/thomas/developer/c/mysql/nativelibs/libNativeMySQL.so: /home/thomas/developer/c/mysql/nativelibs/libNativeMySQL.so: undefined symbol: __gxx_personality_v0
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1473)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1397)
            at java.lang.Runtime.loadLibrary0(Runtime.java:788)
            at java.lang.System.loadLibrary(System.java:832)
            at DbConvert.<clinit>(DbConvert.java:28)


    :heul: was hat er denn jetzt schon wieder?
    Ich habe alles, inklusive JDK, auf meiner Gentoo selber compiliert (gcc3.2), Laufzeit-Linkfehler sollten dann doch nicht auftreten, oder?

  • Hi,


    Zitat

    :heul: was hat er denn jetzt schon wieder?
    Ich habe alles, inklusive JDK, auf meiner Gentoo selber compiliert (gcc3.2), Laufzeit-Linkfehler sollten dann doch nicht auftreten, oder?


    probier' mal, Deine Shared Library mit "-symbol" zu linken. Dann sollte Dir bereits der Linker sagen, welche Symbole noch fehlen. Entsprechende Libraries muesstest Du dann wohl noch dazu linken.


    Gruesse
    Markus

    yaVDR 0.5.0a
    DD Cine S2 V6.5 & DuoFlex S2, ASRock B75 PRO3, NVidia GT610-SL, Core i3-2120T, 4GB, 60GB SSD, 1.5TB
    Samsung UE46F8090, Sony STR-DB780, 5.0 surround A.C.T. speaker

  • So, hab einige Probleme in den Griff bekommen.


    Eine Lösung davon war es, anstelle von gcc g++ zu verwenden :], eine andere Stellen wie


    Code
    extern "C" {


    zu entfernen.


    Nun bekomme ich beim Starten des Javaprogramms ein:


    Code
    thomas@thomas stuff $ /opt/sun-j2sdk-1.4.1/bin/java DbConvert
    Exception in thread "main" java.lang.UnsatisfiedLinkError: createConnection
            at NativeConnection.createConnection(Native Method)
            at NativeConnection.<init>(NativeConnection.java:34)
            at DbConvert.main(DbConvert.java:50)


    Soweit war ich ja schon mal :rolleyes:


    Ich schätze mal das ist wohl ein JNI-Problem, oder?


    Im Interface sieht das so aus:


    Code
    JNIEXPORT jint JNICALL Java_NativeConnection_createConnection
      (JNIEnv *, jobject, jstring, jstring, jstring, jstring);


    im Javacode dagegen so (in Auszügen):


    Code
    private native final int createConnection(String url, String db, String user, String password);
    
    
    NativeConnection connection = new NativeConnection(args[0], args[1], args[2], args[3]);
  • JUHU


    *ausflipp*


    *abgeh*


    Hab's hinbekommen :] :] :] :]


    Von Tuten und Blasen bei C keine Ahnung, aber kaum tüftelt man drei Tage schon funktionierts :D


    Für die, die's interessiert:


    Mit "less" kann man sich von einer Library die zur Verfügung gestellten Symbole anzeigen lassen.
    Da waren noch Pfade drin von alten Packages (die NativeInterface Methoden sehen immer so aus: Java_<package>_<Klasse>_<Methodenname>), so kann das natürlich nicht gehen!!!


    Alles angepasst, neu kompiliert und dann gings: :]


    Ein grosses [Blockierte Grafik: http://mysmilies.no-ip.com/mysmilies/knuddel_2.gif] an alle die mir geholfen haben.


    Im speziellen ein [Blockierte Grafik: http://mysmilies.no-ip.com/mysmilies/knuddel_2.gif] an mark2, wenn wir uns mal auf einem Treffen sehen sollten lad ich Dich auf 1+n Biere ein :D

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!