Mixing C Code in einem C++ Programm

OP #4202824
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ß
Gast #4202860
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
OP #4202887
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?
OP #4202933
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?!?
OP #4202942
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren