GNU/Linux >> Tutoriales Linux >  >> Linux

Llame a una función C desde el código C++

Compile el código C así:

gcc -c -o somecode.o somecode.c

Entonces el código C++ así:

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

Luego conéctelos con el enlazador de C++:

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

También tiene que decirle al compilador de C++ que viene un encabezado de C cuando incluye la declaración de la función de C. Así que othercode.cpp comienza con:

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

somecode.h debe contener algo como:

 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(Usé gcc en este ejemplo, pero el principio es el mismo para cualquier compilador. Construya por separado como C y C++, respectivamente, luego conéctelo).

Permítanme recopilar los fragmentos de las otras respuestas y comentarios, para darles un ejemplo con código C y C++ claramente separados:

La parte C:

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

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

Compile esto con gcc -c -o foo.o foo.c .

La parte de C++:

bar.cpp

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

void bar() {
  foo();
}

Compile esto con g++ -c -o bar.o bar.cpp

Y luego vincularlo todo:

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

Justificación: El código C debe ser código C simple, sin #ifdef s para "tal vez algún día llame a esto desde otro idioma". Si algún programador de C++ llama a sus funciones C, es su problema de cómo hacer eso, no el tuyo. Y si usted es el programador de C++, es posible que el encabezado de C no sea suyo y no debe cambiarlo, por lo que el manejo de los nombres de funciones no alterados (es decir, el extern "C" ) pertenece a su código C++.

Por supuesto, puede escribir un encabezado C++ conveniente que no haga nada más que envolver el encabezado C en un extern "C" declaración.


Linux
  1. Llamada a función indefinida simplexml_load_file() – Error de PHP [Resuelto]

  2. Encuentre el número de líneas de código del repositorio de GitHub

  3. ¿Ejecutando la función definida por el usuario en una llamada Find -exec?

  4. ¿Es Rsync ~/foo Target/foo lo mismo que Rsync ~/foo/ Target/foo/?

  5. ¿Cómo llamar a una función Bash en Bash Script dentro de Awk?

Conceptos básicos de la compilación de software a partir del código fuente en Linux

¿Llamar a notificar-enviar desde una regla de Udev?

¿Cómo puedo perfilar el código C++ que se ejecuta en Linux?

No se puede llamar a la función de biblioteca estándar de C en Linux de 64 bits desde el código ensamblador (yasm)

¿Cómo elimino el código VS y la configuración de Ubuntu?

función de llamada declarada a continuación