GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Rufen Sie eine C-Funktion aus C++-Code auf

Kompilieren Sie den C-Code wie folgt:

gcc -c -o somecode.o somecode.c

Dann der C++-Code wie folgt:

g++ -c -o othercode.o othercode.cpp

Verbinden Sie sie dann mit dem C++-Linker:

g++ -o yourprogram somecode.o othercode.o

Sie müssen dem C++-Compiler auch mitteilen, dass ein C-Header kommt, wenn Sie die Deklaration für die C-Funktion einschließen. Also othercode.cpp beginnt mit:

extern "C" {
#include "somecode.h"
}

somecode.h sollte so etwas wie:

enthalten
 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(Ich habe in diesem Beispiel gcc verwendet, aber das Prinzip ist für jeden Compiler gleich. Erstellen Sie separat als C bzw. C++ und verknüpfen Sie es dann miteinander.)

Lassen Sie mich die Bits und Stücke aus den anderen Antworten und Kommentaren zusammentragen, um Ihnen ein Beispiel mit sauber getrenntem C- und C++-Code zu geben:

Der C-Teil:

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

void foo(void)
{
    /* ... */
}

Kompilieren Sie dies mit gcc -c -o foo.o foo.c .

Der C++-Teil:

bar.cpp

extern "C" {
  #include "foo.h" //a C header, so wrap it in extern "C" 
}

void bar() {
  foo();
}

Kompilieren Sie dies mit g++ -c -o bar.o bar.cpp

Und dann alles miteinander verknüpfen:

g++ -o myfoobar foo.o bar.o

Begründung: Der C-Code sollte einfacher C-Code sein, kein #ifdef s für "Vielleicht werde ich das eines Tages von einer anderen Sprache aus anrufen". Wenn ein C++-Programmierer Ihre C-Funktionen aufruft, sind es ihre Problem, wie man das macht, nicht deins. Und wenn Sie der C++-Programmierer sind, dann gehört der C-Header möglicherweise nicht Ihnen und Sie sollten ihn nicht ändern, sodass die Behandlung von unverfälschten Funktionsnamen (d. h. der extern "C" ) gehört in Ihren C++-Code.

Sie könnten sich natürlich einen bequemen C++-Header schreiben, der nichts anderes tut, als den C-Header in einen extern "C" zu packen Erklärung.


Linux
  1. Ausführen einer benutzerdefinierten Funktion in einem Find -exec-Aufruf?

  2. Ist Rsync ~/foo Target/foo dasselbe wie Rsync ~/foo/Target/foo/?

  3. Aufrufen von C-Funktionen in C++, C++-Funktionen in C (C und C++ mischen)

  4. Ausführen einer User-Space-Funktion aus dem Kernel-Space

  5. Rufen Sie eine Userspace-Funktion innerhalb eines Linux-Kernel-Moduls auf

Grundlagen zum Kompilieren von Software aus dem Quellcode unter Linux

Aufruf der undefinierten Funktion simplexml_load_file() – PHP-Fehler [Gelöst]

Ermitteln Sie die Anzahl der Codezeilen aus dem GitHub-Repository

Notify-Send von einer Udev-Regel aufrufen?

Wie kann ich C++-Code profilieren, der unter Linux ausgeführt wird?

Rufen Sie die unten deklarierte Funktion auf