Forum: PC-Programmierung Mixing C Code in einem C++ Programm


von X. A. (wilhem)


Lesenswert?

Jungs!
Hi,
ich habe ein Programm in C++ geschrieben, das durch einem CMakeLists.txt 
kompiliert wird. Der benutzte Kompiler ist gnu c++11.
Na gut....nun habe ich das Problem, dass ich eine dritte Bibliothek 
(diese: 
http://wiki.asctec.de/display/AR/Introduction+and+First+Connection) in 
meinem Programm einbinden muss. Normalerweise habe ich damit kein 
Problem aber nun bekomme ich diese Fehlermeldung:
1
asctecCommIntf.c:1782:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
2
  for(int i=0;i<aciMagicCodeCmdLoaded;i++) {
3
  ^

So habe ich die Bibliothek in einem separaten Verzeichnis abgespeichert 
und versucht mit einem getrennten CMakeLists.txt zu kompilieren:
1
set( CMAKE_CXX_FLAGS "-std=c99" )
2
3
# Define the following files as library
4
set( asctecLibrary_SRCS asctecCommIntf.c )
5
6
# Compile as a shared library
7
add_library( asctecLibrary SHARED ${asctecLibrary_SRCS} )

Dabei habe ich den Compiler C99 nur für die Bibliothek verwendet.
Wenn ich aber versuche, alles zusammen zu kompilieren, kriege ich immer 
noch die gleichen Fehlermeldungen.
Eine Überarbeitung der Bibliothek ist unmöglich...es enthält tausenden 
von diesen for-Schleife.

Danke
Gruß

von Sebastian V. (sebi_s)


Lesenswert?

Ich hab zwar keine Ahnung von cmake aber vielleicht solltest du statt 
CMAKE_CXX_FLAGS mal die CMAKE_C_FLAGS Variable ausprobieren, um deine 
Flags zu setzen?

von Peter C. (peter_c49)


Lesenswert?

>for(int i=0;i<aciMagicCodeCmdLoaded;i++) {

int i;

...

for(i=0;i<aciMagicCodeCmdLoaded;i++) {

von Peter II (Gast)


Lesenswert?

Dave A. schrieb:
> loop initial declarations are only allowed in C99 mode

ist das wirklich ernst gemeint, das das in C++11 nicht mehr geht? Das 
wird doch ständig so verwendet. Haben die diesmal wirklich nicht auf 
Abwärtskompatibilität geachtet?

von db8fs (Gast)


Lesenswert?

Peter II schrieb:
> Dave A. schrieb:
>> loop initial declarations are only allowed in C99 mode
>
> ist das wirklich ernst gemeint, das das in C++11 nicht mehr geht? Das
> wird doch ständig so verwendet. Haben die diesmal wirklich nicht auf
> Abwärtskompatibilität geachtet?

Freilich geht das in C++11. Du nutzt allerdings reine C-Sourcen und für 
die ist nicht der g++ sondern der C-Compiler zuständig. Und weil du 
CMake die CXXFlags übergeben hat, macht der genau das, was du ihm gesagt 
hast zu tun: als CXXFlag den C99 Standard dem C++ Compiler zu übergeben.

Du kannst also folgendes tun:
- Benenn deine Sourcen entweder in .cpp um
- sag CMake, C-Source mit dem C++ zu übersetzen
- übergib deinen C99-Standard an den C-Compiler
- schreib ANSI-C89 und deklariere deine Laufvariablen zu Beginn deines 
Blocks

von X. A. (wilhem)


Lesenswert?

Nichts...
ich kriege es nicht hin..

Ich habe mit den folgenden Konfigurationen probiert:
1
set( CMAKE_C_COMPILER_INIT "-std=c99" )
2
3
# Define the following files as library
4
set( asctecLibrary_SRCS asctecCommIntf.c )
5
6
# Compile as a shared library
7
add_library( asctecLibrary SHARED ${asctecLibrary_SRCS} )

und
1
set_source_files_properties( asctecCommIntf.c PROPERTIES LANGUAGE CXX )
2
3
# Define the following files as library
4
set( asctecLibrary_SRCS asctecCommIntf.c )
5
6
# Compile as a shared library
7
add_library( asctecLibrary SHARED ${asctecLibrary_SRCS} )

die Fehlermeldungen verschwinden nicht.

In meinem C++ habe ich die folgende Anweisung geschrieben:
1
extern "C" {
2
    #include "../functions/asctecCommIntf.h"
3
}

Ich habe ein CMakeLists für das gesamte Projekt. Plus mehrere CMakeLists 
in den verschiedenen Ordner. Mit einem Befehl werden die Bibliotheken 
als statisch verlinkt. In diesem Fall wie kann ich die beide c Dateien 
mit einem C Compiler kompilieren lassen?

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Und was ist mit dem schon vorgeschlagenen
1
SET(CMAKE_C_FLAGS -std=c99)

von X. A. (wilhem)


Lesenswert?

Es ändert sich nichts...

Resumé:

Mein Projekt sieht folgendermaßen aus:

/Projekt
->/functions
  ->CMakeLists.txt
  ->asctecCommIntf.c
  ->asctecCommIntf.h
  ->asctecDefines.h

->main.cpp
->CMakeLists.txt


In dem CMakelists in dem Verzeichnis Functions habe ich folgendes:
1
# Here the file for the Asctec 
2
set( CMAKE_C_FLAGS -std=c99 )
3
4
# Define the following files as library
5
set( asctecLibrary_SRCS asctecCommIntf.c )
6
7
# Compile as a shared library
8
add_library( asctecLibrary SHARED ${asctecLibrary_SRCS} )

während in dem Root Verzeichnis, also die Hauptdatei "CMakeLists":
1
...
2
3
add_subdirectory( functions )
4
5
## Declare a cpp executable
6
add_executable( myprog main.cpp )
7
8
## Specify libraries to link a library or executable target against
9
target_link_libraries( myprog
10
    dynamicLibrary
11
    asctecLibrary
12
    ${catkin_LIBRARIES}
13
)
14
15
...

In mein main.cpp habe ich die folgende Zeile:
1
extern "C" {
2
    #include "functions/asctecCommIntf.h"
3
}

In allen Fällen kriege ich die folgende Fehlermeldung:
1
error: ‘for’ loop initial declarations are only allowed in C99 mode
2
  for(int i=0;i<aciMagicCodeVarLoaded;i++) {
3
  ^
tausende Male wiederholt.

Was mache ich falsch?!?

: Bearbeitet durch User
von db8fs (Gast)


Lesenswert?

Mach ein add_definitions( -std=c99 ), dann sollte es klappen.

Richtiger wäre aber tatsächlich das CFLAG dem C-Compiler mitzugeben - 
oder die anderen in meinem obigen Beitrag erwähnten Mittel.

von X. A. (wilhem)


Lesenswert?

db8fs schrieb:
> Mach ein add_definitions( -std=c99 ), dann sollte es klappen.
>
> Richtiger wäre aber tatsächlich das CFLAG dem C-Compiler mitzugeben -
> oder die anderen in meinem obigen Beitrag erwähnten Mittel.

nein, leider geht es auch nicht.

Ich würde gerne deine Vorschläge probieren, dennoch kann ich ohne 
Beispiel nicht viel anfangen.

Noch dazu:

ich habe festgestellt, dass sowohl in der .c als auch in der .h Dateien 
die folgende Direktive vorgesehen war:
1
#ifdef __cplusplus
2
extern "C"
3
 {
4
 #endif
5
#include "asctecCommIntf.h"

so habe ich in meinem main.cpp die ähnliche Zeile entfernt.

: Bearbeitet durch User
von X. A. (wilhem)


Lesenswert?

Ok ok
Mea culpa...
Ich hatte aus versehen eine Direktive in einer anderen CMakeLists Datei 
vergessen. Daher die Fehlermeldungen. Deine Vorschläge haben also 
funktioniert. Die Fehler kamen aus einer anderen CMakeLists.

Also es funktioniert!
Danke!

Gruß

von Falk S. (falkschilling)


Angehängte Dateien:

Lesenswert?

Ok, na denn ist gut. Hatte schon angefangen, mal ein kleines CMake-Demo 
zu machen, ist aber wohl überflüssig. Hängt aber trotzdem mal hier, 
vielleicht kanns mal jemand brauchen.

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.