Externe Libs (pthread & gtk)

Hallo!
Ich habe ein Problem mit den Compilern unter Windows. Unzwar will ich mit Eclipse/Bloodshed/Whatever meine Programme unter windows in einer VirtualBox compilieren. Also von Linux portieren.
Allerdings machen Eclipse und Bloodshed ziemlich die selben Fehler:
"cannot find -lpthread"
Beim compilieren von Programmen mit POSIX-threads. Muss man irgend eine Systemvariable erstellen damit die pthread libs gefunden werden?
Hab mir schon das neuste release von ftp://sourceware.org/pub/pthreads-win32/ gedownloaded und nach C:/pthread/ entpackt und eclipse den include Ordner bei "C++ Compiler/Directories" gefüttert. Hilft allerdings nichts.

Das Zweite Problem ist GTK. Wenn ich ein GTK Programm compilieren will, kommen >1000 Fehler, alle in dem GTK Verzeichnis unter C:\GTK...
Vorweg habe ich GTK in die Systemvariablen eingetragen:
"User Variables" frame-> "PATH" -> C:\GTK\bin
Systemvariablen:
LIB c:\GTK\lib
GTK_BASEPATH c:\GTK
INCLUDE c:\GTK\INCLUDE;c:\GTK\GTK-2.0;c:\GTK\GLIB-2.0; c:\GTK\PANGO-1.0; c:\GTK\ATK-1.0; c:\GTK\GTKGLEXT-1.0; c:\GTK\GTK-2.0\INCLUDE; c:\GTK\GLIB-2.0\INCLUDE; c:\GTK\GTKGLEXT\INCLUDE; c:\GTK\INCLUDE\LIBGLADE-2.0; c:\GTK\INCLUDE\LIBXML2;
Außerdem in Eclipse die selben Einstellungen wie unter Linux:
Dem C++ Compiler/Directory den Ordner von GTK-2.0 gegeben
und dem Linker noch die Option: `pkg-config gtk+-2.0 --libs` angehängt.

Weis mir wirklich keinen Rat mehr und google liefert seit Stunden nichts gescheites. :.(
Währe nett, wenn mir jemand weiterhelfen könnte.

PS.: Sowas geht unter Linux >wesentlich< einfacher. ^^
 
Ich glaube Windows hat auch sowas wie einen LD_LIBRARY_PATH in dem Ordner mit Bibliotheken aufgelistet sind. Ausserdem unterstützt Windows meines Wissens nach keine eingebetteten Befehle wie `pkg-config gtk+-2.0 --libs`. Dass pkg-config standardmässig im PATH zur Verfügung steht, wage ich sogar zu bezweifeln.
 
Das LD_LIBRARY_PATH Equivalent in Windows ist afaik INCLUDE.

Es steht nicht standartmäßig zur Verfügung. Das hab ich ja auch selber eingetragen.
Das sagt die Komandozeile dazu:
C:\Dokumente und Einstellungen\Administrator>pkg-config gtk+-2.0 --cflags
-mms-bitfields -IC:/GTK/include/gtk-2.0 -IC:/GTK/lib/gtk-2.0/include -IC:/GTK/in
clude/atk-1.0 -IC:/GTK/include/cairo -IC:/GTK/include/pango-1.0 -IC:/GTK/include
/glib-2.0 -IC:/GTK/lib/glib-2.0/include -IC:/GTK/include/libpng12
und
C:\Dokumente und Einstellungen\Administrator>pkg-config gtk+-2.0 --libs
-LC:/GTK/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.
0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -l
gmodule-2.0 -lglib-2.0 -lintl
Das sieht eigentlich so aus, als währe alles richtig eingetragen.

Der Compiler sagt aber etwas ganz anderes :/
Ohne Anführungszeichen:
Code:
**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 pkg-config gtk+-2.0 --libs -osrc\Test.o ..\src\Test.cpp
cc1plus.exe: error: unrecognized command line option "-flibs"
g++: pkg-config: No such file or directory
g++: gtk+-2.0: No such file or directory
Build error occurred, build is stopped
mit:
Code:
**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 pkg-config gtk+-2.0 --libs -osrc\Test.o ..\src\Test.cpp
g++: pkg-config gtk+-2.0 --libs: No such file or directory
Build error occurred, build is stopped

Kurzum: CMD sagt ja, g++ sagt nein. Aber warum? :.(
 
Weil Windows ganz offensichtlich keine eingebetteten Befehle unterstützt und die Backticks als normale String-Marker erkennt.

Falsch:
Code:
g++ -O0 -g3 -Wall -c -fmessage-length=0 pkg-config gtk+-2.0 --libs -osrc\Test.o ..\src\Test.cpp

Richtig:

Code:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -LC:/GTK/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -l gmodule-2.0 -lglib-2.0 -lintl -osrc\Test.o ..\src\Test.cpp

Kurzum... der eingebettete Befehl wird offensichtlich als String interpretiert. Ausserdem glaube ich nicht, dass der INCLUDE von Windows was mit dem LD_LIBRARY_PATH zu tun hat. In diesem sind sicherlich die Header (Include Files), nicht aber die Libs vermerkt.
 
Das macht Sinn. Also im Grunde genommen die Ausgabe nutzen, statt den Befehl selbst.

Das Ganze mit den Systemvariablen scheint nicht so ganz sauber zu laufen, also lass ich das und gebe dem Compiler einfach die Include-Pfade mit auf den Weg.
Build klapp jetzt auch, #include <gtk/gkt.h> wird auch akzeptiert, bloß die GTK Befehle selbst werden mir als "undefinded reference" bemängelt.
**** Internal Builder is used for build ****
g++ -IC:\GTK\include\glib-2.0 -IC:\GTK\include\pango-1.0 -IC:\GTK\include\libpng12 -IC:\GTK\lib\glib-2.0\include -IC:\GTK\lib\gtk-2.0\include -IC:\GTK\include -IC:\GTK\include\gtk-2.0 -IC:\GTK\lib\gtk-2.0\include -IC:\GTK\include\atk-1.0 -IC:\GTK\include\cairo -O0 -g3 -Wall -c -fmessage-length=0 -osrc\Test.o ..\src\Test.cpp
g++ -LC:/GTK/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -l gmodule-2.0 -lglib-2.0 -lintl -oTest.exe src\Test.o
src\Test.o(.text+0x150): In function `main':
C:/Workspace/Test/Debug/../src/Test.cpp:15: undefined reference to `gtk_init_abi_check'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Source:
Code:
#include <iostream>
#include <gtk/gtk.h>
using namespace std;
int main( int argc, char *argv[] )
{
    gtk_init( &argc, &argv); //Fehler
	cout << "!!!Hello World!!!" << endl;
	return 0;
}

Aberr GTK wird doch mit gelinkt. Da müsste die Funktion doch drinn sein?
 
Nein, die Bibliotheken werden zwar einkompiliert, aber der dynamische Linker findet sie offenbar nicht. Ggf. verschafft ein statisches Linken Abhilfe oder du setzt halt den LD_LIBRARY_PATH korrekt. Mittlerweile weiss ich, dass es den bei Windows auch als Umgebungsvariable gibt, so war zumindest die Aussage eines Cygwin-Entwicklers und der sollte es ja eigentlich wissen.
 
Ich wollte mich jetzt nochmals daran versuchen und grabe deswegen diesen Thread wieder aus.
Das Kompilieren und linken funktioniert jetzt soweit, nur beim starten gibt es ein Problem: Die Zeichen können nicht angezeigt werden (nur ein rechteckiger Kasten), da Pango scheinbar ein Modul nicht finden kann. Schaut euch das am besten auf dem Screenshot im Anhang an.
Ich habe testweise einfach alle DLL-Dateien aus dem C:\GTK\bin Verzeichnis in das Programmverzeichnis kopiert.
Zum kompilieren habe ich Eclipse CDT in einer WindowsXP VirtualBox verwendet. Wenn die Einstellungen der IDE wichtig sein sollten, sagt bescheid. Hier mal der Compiler-Befehl, den Eclipse daraus generiert: (damit auch das Ganze auch ohne Eclipse-Kentnisse nachvollziehbar bleibt)
Code:
**** Internal Builder is used for build               ****
g++ -IC:\GTK\/include/cairo -IC:\GTK\/include/libglade-2.0 -IC:\GTK\/include/gtk-2.0 -IC:\GTK\/include/glib-2.0 -IC:\GTK\/lib/glib-2.0/include -IC:\GTK\/lib/gtk-2.0/include -IC:\GTK\/include/pango-1.0 -IC:\GTK\/include/atk-1.0 -IC:\GTK\/include/libxml2 -IC:\GTK\include -O0 -g3 -Wall -c -fmessage-length=0 -mms-bitfields -omain.o ..\main.cpp
g++ -LC:\GTK\lib -mms-bitfields -oSimple_unrar_IDE.exe main.o -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv -lglade-2.0 -lxml2
Build complete for project Simple_unrar_IDE
Time consumed: 3636  ms.
Das ist jetzt alles statisch gelinkt, ohne die Umgebungsvariablen zu nutzen.
Ich habe außerdem dieses Codebeispiel verwendet. *click*

Edit: ok, hat sich schon erledigt. Man o man, war nur ein Fehler der durch copy&paste des "pango-querymodules > C:\workspace\Test\etc\pango\pango.modules" befehls aufgetreten ist. Manchmal ist man einfach blind... X(
 
Zurück
Oben