Forum: PC-Programmierung Visual C++ 2010 Express C-File kompilieren


von A. B. (funky)


Lesenswert?

Hi,

evtl kann mir ja jemand helfen.

Kann mir jemand sagen, was ich umstellen muss, damit Express auch *.c 
Files kompiliert bzw. linkt?

Ich packe meine Deklaration in ein *.h File und die Definition in ein c 
File. Das wird nicht gelinkt, weil er die Funktionen nicht findet.
Nenne ich das c-File in ein cpp-File um, dann funktioniert alles.

Es müsste ja irgendeinen Compilerschalter geben(den ich aber noch nicht 
gefunden habe) der das Problem löst und auch c Files statt nur cpp Files 
berücksichtigt werden

Ich wollte einie Algorithmen auf dem PC testen, bevor ich sie im 
Mikrocontroller benutze. Die Mikrocontroller Entwicklungsumgebung kommt 
aber nicht mit cpp Files zurecht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du musst das C-File schon zum Projekt hinzufügen, damit es übersetzt 
wird. Im Projekt steht bei Dir aber offensichtlich ein C++-File, das 
muss da raus.

von A. B. (funky)


Lesenswert?

die Files sind hinzugefügt.

In der Projektübersicht habe ich neben den Files aber ein C++ Icon 
stehen. Bei den Dateieigenschaften des C-Files kann ich aber nur "C/C++ 
Code" auswählen, und nicht explizit C Code.

von Klaus W. (mfgkw)


Lesenswert?

ich habe im VS2008 für *.c und *.cpp ebenfalls dasselbe Icon.
Hat mich aber bisher nie gestört (ist mir aber nie aufgefallen).

von A. B. (funky)


Lesenswert?

Ich habe die Dateien über "Hinzufügen -> Vorhandenes Element" dem 
Projekt hinzugefügt.

Aber auch wenn ich ein ganz neues Element hinzufügen will, kann ich nur 
"C++ cpp" Dateien hinzufügen. Die Auswahl für c-Files habe ich da 
nirgends.

von A. B. (funky)


Lesenswert?

@klaus: stören tut mich das auch nicht, aber bei mir sucht er nur nach 
cpp Dateien und nicht nach c Dateien. Und dafür wird es doch sicherlich 
einen Schalter geben das er die berücksichtigt?!

von Klaus W. (mfgkw)


Lesenswert?

A. B. schrieb:
> Ich habe die Dateien über "Hinzufügen -> Vorhandenes Element" dem
> Projekt hinzugefügt.
>
> Aber auch wenn ich ein ganz neues Element hinzufügen will, kann ich nur
> "C++ cpp" Dateien hinzufügen. Die Auswahl für c-Files habe ich da
> nirgends.

stimmt, bei den komischen Templates ist bei mir auch kein .c dabei.
Du kannst aber eine .cpp hinzufügen, und danach mit der rechten 
Maustaste umbenennen.

von Klaus W. (mfgkw)


Lesenswert?

MS will dich zu dem tollen managed-Müll und .NET "überreden", die haben
kein Interesse an .c.
SIE wollen doch nur dein bestes, deshalb enthalten SIE dir vor, was du 
möchtest. SIE wissen einfach besser, daß dir C nicht gut bekommt.

von tut nichts zur sache (Gast)


Lesenswert?

... im cpp-file:
1
extern "C"{
2
  #include "dein_c_header.h"
3
}

oder

rechte Maus auf dein c-File -> Properties.


Configuration Properties -> C/C++ -> Advanced -> Compile As: Compile As 
C++ code

von A. B. (funky)


Lesenswert?

nope, mit umbennen das funktioniert eben nicht

error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""enum 
STATUS_t __cdecl nedap_stm(unsigned char)" 
(?nedap_stm@@YA?AW4STATUS_t@@E@Z)" in Funktion "_wmain".
1>C:\daten\projekte\keypad_wintest\Debug\keypad_wintest.exe : fatal 
error LNK1120: 1 nicht aufgelöste externe Verweise.

Fehlermeldungen gibt es dann.

von A. B. (funky)


Lesenswert?

Vielen Dank!

 "compile as c code" war es unter den erweiterten Einstellungen.
war mir nicht aufgefallen, weil das vorher auf Standard stand.

Kompilerflag ist /TC

Funktioniert nun mit *.h und *.c Files

von Klaus W. (mfgkw)


Lesenswert?

so, habe das eben probiert mit VS2008 Prof..

Neues Projekt (Konsole) angelegt namens tmp.
Die tmp.cpp darin (printf() eingefügt) erst kompiliert, läuft.
Im "Solution Explorer" die tmp.cpp zu tmp.c embenannt, kompiliert, 
läuft.

von A. B. (funky)


Lesenswert?

Schön...

Hier läuft es aber so nicht, wenn ich die Deklaration in ein h-File und 
die Definition in ein C File packe. Weil er automatisch erstmal C++ 
annimmt und dann nach einem CPP File sucht.

Ich kann es doch auch nicht ändern :)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das hängt möglicherweise mit dem Typ des von Dir angelegten Projektes 
zusammen. "Er" jedenfalls sucht überhaupt nicht nach irgendwelchen 
Dateitypen, "Er" übersetzt das, was man ihm vorwirft.

von A. B. (funky)


Lesenswert?

machst du dich auf subtile art&weise darüber lustig, das ich meinen 
compiler als "er" bezeichne? ;)

von ... (Gast)


Lesenswert?

A. B. schrieb:
> machst du dich auf subtile art&weise darüber lustig, das ich meinen
> compiler als "er" bezeichne? ;)

Sicher nicht, sondern daß der Compiler keine Files sucht. Er nimmt das, 
was man ihm vorsetzt. Und der Microsft Compiler ist schlau genug ein .c 
File als C Code zu übersetzen und ein .cpp File als C++ Code. Es sei 
denn, man zwingt ihn mittels Optionen dazu sich dumm zu stellen.
Du hast allerdings das eigentliche Problem noch nicht verstanden.
Du hast ein .c File mit einer Funktion und ein dazu passendes .h File. 
Daraus erzeugt der Compiler ein globales Symbol, das dem Namen Deiner 
Funktion entspricht (eventuell mit vorangestelltem "_").
Jetzt versuchst Du aber diese C-Funktion aus einem .cpp File heraus 
aufzurufen und der Compiler geneeriert ein Symbol mit C++ Namemangling 
("?nedap_stm@@YA?AW4STATUS_t@@E@Z") nach dem der Linker suchen soll. 
Dieses ist natürlich nicht vorhanden (sondern nur "_nedap_stm").
Der "Trick" ist jetzt, dem C++ Compiler mitzuteilen, das es sich bei der 
aufgerufenen Funktion um eine C-Funktion handelt. Das macht man mit dem 
oben bereits erwähnten extern "C" Konstrukt 
(Beitrag "Re: Visual C++ 2010 Express C-File kompilieren"). Entweder wie oben 
beim Einbinden des .h Files oder gleich direkt .h File selbst.

von ... (Gast)


Lesenswert?

A. B. schrieb:
> Aber auch wenn ich ein ganz neues Element hinzufügen will, kann ich nur
> "C++ cpp" Dateien hinzufügen. Die Auswahl für c-Files habe ich da
> nirgends.

Einfach in den Templates .cpp auswählen und dann aber den Namen mitsamt 
der Endung .c schreiben.
Geht zumindest in VS2005/2008.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.