Hallo,
ich habe ein C++ Projekt als Konsolenanwendung entwickelt. Jetzt möchte
ich dieser Klasse ein UI verpassen und die funktionen, welche ich
entwickelt hab mittels Buttons aufrufen. Soweit so gut.
Ich hab mit Hinzufügen->Neues Element -> Windows Form das Form erstellt.
Das funktionierte wunderbar.
Jetzt wollte ich das Form aus meiner main()-Funktion öffnen. Also wollte
ich mit
1
#include"gui.h"
das UI bekannt machen. Jetzt kommen allerdings die folgenden
Fehlermeldungen:
Fehler 1 error C2871: 'System': Es ist kein Namespace mit diesem Namen
vorhanden c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 3
Fehler 7 error C2871: 'Forms': Es ist kein Namespace mit diesem Namen
vorhanden c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 6
Fehler 11 error C2871: 'Drawing': Es ist kein Namespace mit diesem
Namen vorhanden c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 8
Fehler 9 error C2871: 'Data': Es ist kein Namespace mit diesem Namen
vorhanden c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 7
Fehler 3 error C2871: 'ComponentModel': Es ist kein Namespace mit
diesem Namen vorhanden c:\thomas\sw\kopie von 2011-01-04
hsi_gui\host\gui.h 4
Fehler 5 error C2871: 'Collections': Es ist kein Namespace mit diesem
Namen vorhanden c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 5
Fehler 2 error C2653: 'System': Keine Klasse oder Namespace
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 4
Fehler 4 error C2653: 'System': Keine Klasse oder Namespace
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 5
Fehler 6 error C2653: 'System': Keine Klasse oder Namespace
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 6
Fehler 8 error C2653: 'System': Keine Klasse oder Namespace
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 7
Fehler 10 error C2653: 'System': Keine Klasse oder Namespace
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 8
Fehler 14 error C2653: 'System': Keine Klasse oder Namespace
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 22
Fehler 16 error C2447: '{': Funktionsheader fehlt - Parameterliste im
alten Stil? c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 23
Fehler 15 error C2143: Syntaxfehler: Es fehlt ';' vor '{'
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h 23
Fehler 12 error C2059: Syntaxfehler: 'public' c:\thomas\sw\kopie von
2011-01-04 hsi_gui\host\gui.h 22
Fehler 13 error C2059: Syntaxfehler: 'public' c:\thomas\sw\kopie von
2011-01-04 hsi_gui\host\gui.h 22
Was habe ich falsch gemacht? Hat jmd. eine Idee?
Ich versuche mich mal weiter.
Grüße Tom
Tom A. schrieb:> Jetzt wollte ich das Form aus meiner main()-Funktion öffnen. Also wollte> ich mit
1
#include"gui.h"
das UI bekannt machen. Jetzt kommen
> allerdings die folgenden Fehlermeldungen:
Seh ich das richtig, dass du versuchst eine Konsolenanwendung mit einer
GUI zu pimpen?
Normlerweise ist das keine gute Idee.
Lass dir vom Wizard eine GUI Anwendung generierern und bau dann die
Teile aus deiner Konsolenanwendung dort ein, wo du sie brauchst.
Also genau anders rum:
Nicht die Konsolenanwendung pimpen.
Sondern eine frische GUI-Lösung mit Funktionalität pimpen (die du in
Form eines Konsolenprogramms schon getestet hast und somit weitgehend
einfach übernehmen kannst)
Grund: Der ganze Projektaufsatz (Compiler-Einstellungen,
Linker-Einstellung, sonstiges) ist bei GUI-Projekten ein wenig anders.
Sowas in einer Konsolenanwendung nachzurüsten ist viel Arbeit, bei der
man gerne was übersieht. Daher lässt man sich das vom Wizzard einfach
neu generieren, das geht schneller als anders rum.
Karl heinz Buchegger schrieb:> Nicht die Konsolenanwendung pimpen.> Sondern eine frische GUI-Lösung mit Funktionalität pimpen (die du in> Form eines Konsolenprogramms schon getestet hast und somit weitgehend> einfach übernehmen kannst)
Der Königsweg: Die Funktionalität in eine Bibliothek auslagern und dann
in GUI und Konsolenprogramm verwenden.
Ok,
also ich hab es versucht meine Klasse einzubinden. Das hat glaube ich
funktioniert. Jetzt habe ich aber ein Problem. Meine Klasse verwendet
eine Libary (CyAPI.lib).
Ich hab den dazugehörigen Header eingefügt und es scheint soweit zu
funktionieren, dass die Funktionen usw. erkannt werden.
Jetzt habe ich aber das Problem, dass diese Funktionen einen
Rückgabewert haben, den VS nicht kennt ...
Davon bekomme ich jetzt an die 200 Fehlermeldungen bis das compilieren
abgebrochen wird ...
Hier mal eine von vielen Fehlermeldungen.
Fehler 42 error C4430: Fehlender Typspezifizierer - int wird
angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\dokumente und einstellungen\albrec\eigene dateien\visual studio
2008\projects\hsi_ui\hsi_ui\CyAPI.h 28
So wie ich das sehe sind VS die ganzen Datentypen UCHAR PUCHAR usw.
nicht mehr bekannt.
Hat jmd. eine Idee wo das problem sein könnte?
Vielen Dank schon mal für die Anregungen.
mh... es ging aber doch davor auch.
außerdem ist es kein int sondern ein andere Datentyp z.b. UCHAR und wenn
ich dann #define UCHAR unsigend char mache muss ich ja dass dann für
alle Datentypen und Datenstruckturen machen ... Das kann ja nicht sein.
Tom A. schrieb:> außerdem ist es kein int sondern ein andere Datentyp z.b. UCHAR und wenn> ich dann #define UCHAR unsigend char mache muss ich ja dass dann für> alle Datentypen und Datenstruckturen machen ... Das kann ja nicht sein.
Du hast vermutlich vergessen, die diese Dinge definierende Headerdatei
vor CyApi.h einzubinden.
Das sollte durch #include <windows.h> erledigt sein.
mh... ok, das hat mich ein paar Fehlermeldungen weitergebracht. Aber
immer noch nicht ans endgültige Ziel.
Hab die folgenden Fehlermeldungen im moment und ein paar mehr.
Fehler 11 fatal error LNK1120: 10 nicht aufgelöste externe Verweise.
C:\Dokumente und Einstellungen\albrec\Eigene Dateien\Visual Studio
2008\Projects\HSI_UI\Debug\HSI_UI.exe
Fehler 5 error LNK2028: Nicht aufgelöstes Token (0A000043) ""public:
void __clrcall CCyUSBDevice::Close(void)"
(?Close@CCyUSBDevice@@$$FQAMXXZ)", auf das in Funktion ""public: int
__clrcall USBDev::send_cmd2Dev(void)" (?send_cmd2Dev@USBDev@@$$FQAMHXZ)"
verwiesen wird. USBDev.obj
Was mich hier verwirrt ist die erste. Hab ich vll. die lib falsch
eingebunden? In meinem ersten Projekt mit der Klasse musste ich nirgends
einen Pfad hinzufügen oder so was... Einfach vorhandenes Element und
dann die lib angeklickt. Dann ist sie im Projektordner und kann
verwendet werden.
Wenn ich sie dort rauslösche kommt "fatal error LNK1120: 1 nicht
aufgelöste externe Verweise." - So bin ich darauf gekommen, dass die lib
vll. falsch eingebunden ist...!?
Hat das was mit dem vorkompilierten Header zutun? Weil aus dem Grund
musste ich ja meine header dateien auch in ein anderes File machen. Vll.
geht es deshalt micht mehr!?
Ich hoffe jmd. kann mir nochmal einen guten Tipp geben :-/
Tom
Tom A. schrieb:> LNK1120: 10 nicht aufgelöste externe Verweise
Der Linker findet die Library oder andere extern erzeugte Bibliotheken
nicht, schau mal nach den Includepfaden.
mh... das passt eigentlich. Also ich hab den Ordner angegeben, in
welcher die Libary liegt.
Hab ich da sonst was falsch eingestellt? (siehe Abbildung)
Beim Konsolen Projekt musste ich aber nichts der gleichen einstellen.
Ich kopiere es einfach rein. Das verwirrt mich ein wenig.
mh... das passiert aber doch über die HEader datei oder nicht?
ich hab die HEader datei "CyAPI.h" in der Klasse wo die lib benötigt
wird. Ansonsten habe ich auch nichts gefunden. Wo muss ich das sonst
noch angeben?
Nein, über die Header-Datei findet der Linker die Library nicht. Du
musst in den Projekteinstellungen unter Linker / Input noch die passende
Library angeben.
Gruß
Markus
Eine Alternative, die bei Verwendung von MS-Compilern funktioniert, ist
folgendes:
#pragma comment(lib, "cyapi.lib")
Wird so eine Zeile im Sourcecode vorgefunden, erzeugt der Compiler in
der betreffenden Objektdatei einen Hinweis für den Linker, daß die so
benannte Library zu linken ist.
Diese wird dann vom Linker im Library-Suchpfad gesucht und gelinkt.
Allerdings ist das eine MS-spezifische Funktionalität, die Nutzern
anderer Compiler nicht zur Verfügung steht.
Hi,
also ich bin wirklich am verzweifeln. Es scheint so, dass ich
irgendetwas falsch mache. Evtl. kann einer von euch das Projekt mal kurz
anschauen und schauen ob es bei euch geht? Bzw. was ich falsch mache.
Es wäre mir wirklich eine sehr große Hilfe. Vll. habe ich beim Projekt
anlegen auch schon ein Fehler gemacht.
Ich versuchs gleich nochmal mit einem neuen projekt...
Danke schonmal im vorraus.
Grüße tom
Also, was mir bei Deinem Projekt aufgefallen ist: Es handelt sich um ein
Managed C++ Projekt (.net-C++). Ist das gewollt? Ich kenne mich mit dem
Mist nicht wirklich aus. C# ok, unmanaged C++ (native C++) vielleicht
auch noch ein wenig, aber bei managed C++ muß ich passen. Was mir etwas
suspekt vorkommt ist das Hinzubinden einer unmanaged Library zu einem
managed Projekt. Aber vielleicht geht das ja.
Ich habe übrigens (in VS2010) die Anzahl der "unresolved externals" (ich
habe ein englisches VS2010) auf 2 reduzieren können: Bei den
Projekt-Eigenschaften unter "General" (Allgemein?) bei "Common Language
Runtime Support" habe ich den Wert "Common Language Runtime Support
(/clr)" eingestellt. Außerdem habe ich unter "Linker" bei "Additional
Library Directories" (Zusätzliche Bibliotheksverzeichnisse?) "$(OutDir)"
eingetragen. Das ist etwas sauberer wie "J:\...". Die verbleibenden 2
unresolved externals rühren wohl von einer weiteren fehlenden Library
her, wie mir scheint, eine mit Winapi-Funktionen.
Gruß
Markus
mh... managed Projekte...
Also ehrlich gesagt hab ich noch nie richtig eine Oberfläche
programmiert.
Und allgemein bin ich ehr der "Bitschuppser" unter den Programmieren.
d.h. ich hab eh µC, DSP usw. programmiert. Aus diesen Gründen kenne ich
mich damit nicht so gut aus.
Ich hab mal eine Oberfläche zusammen gezogen, aber da hatte ich eben
keine Probleme.
Ich werd jetzt mal schauen, ob ich da iwie ein "unmanaged" projekt finde
und das versuchen dann da einzubinden.
Ansonsten werde ich mir vll. mal Qt 4 anschauen. Ich hab allerdings auch
nicht mehr ganz soviel Zeit ;)
Vll. kann sich noch jmd. anders an meinem Projekt versuchen :( Das wäre
nett.
Grüße Tom
Ich sehe schon, Du hast mit .net noch nicht viel Erfahrung. "managed"
ist alles, was zur Laufzeit die .net Common Language Runtime (CLR)
benötigt. Als "unmanaged" werden die Umgebungen bezeichnet, die "native"
laufen, also OHNE CLR auskommen.
Es ist auch kein Problem, managed (C#, VB.NET, managed C++, F#) zu
mischen. Allerdings muß das auf eine bestimmte Art und Weise erfolgen.
Das Stichwort hierzu ist P/Invoke. Dort werden die CLR-Datentypen per
Marshalling so gewandelt, das beide Welten miteinander können.
Wenn Du bislang keine Erfahrung mit Oberflächen hast, wäre ein guter
Einstieg in die MS-Welt z.B. Windows Forms (.net) oder auch Windows
Presentation Foundation (WPF, ebenfalls .net und etwas moderner). Von
Deiner GUI aus sprichts Du dann Deine unmanaged Lib(s) über P/Invoke an.
Das hört sich jetzt alles recht kompliziert an, ist es aber nicht
wirklich. MS hat da recht gute Arbeit geleistet (ich komme von C/C++ und
Java). Ich würde allerdings vorher mal schauen, ob es da nicht eine
Lib/DLL für .net gibt (wird dann Assembly genannt). Das erleichtert das
Leben ungemein.
Ach ja, wenn Du C++ kannst, dann lasse die Finger von managed C++. Wenn
Du C++ nicht so gut kannst, dann sowieso. ;-) Die Sprache der Wahl in
der .net-Welt ist C#. Damit hast Du alle Möglichkeiten die die CLR
bietet.
Gruß
Markus
Tom A. schrieb:> Ist Qt auch für den kommerziellen Betrieb frei?
Ob das Projekt kommerziell ist, ist schon immer egal gewesen. Dir geht
es wohl eher darum, ob man es unter GPL veröffentlichen muß. Das muß man
seit Qt 4.5 nicht mehr.