Uso de Bibliotecas de C para Programas de C++


Estoy tratando de controlar los servos de Dynamixel usando una GUI hecha usando Qt. Dynamixel proporciona un conjunto C de bibliotecas C para controlar los motores, mientras que la única forma de hacer GUI que conozco es Qt, que es esencialmente C++. ¿Será posible utilizar bibliotecas de Dynamixel C desde código Qt C++ de alguna manera?

 28
Author: johngreen, 2012-08-22

7 answers

Sí, C++ puede compilar C con un compilador de C++ y puede enlazar C++ contra C. Solo asegúrese de que cualquier función de C que llame use enlace de C. Esto se hace mi encerrando el prototipo de por un extern "C"

#ifdef __cplusplus
extern "C"{
#endif 

void c_function_prototype();

#ifdef __cplusplus
}
#endif

Las cabeceras de la biblioteca ya pueden hacer eso, por cierto.

 42
Author: André Oriani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 04:32:49

Claro ... El código C se llama desde C++ todo el tiempo. Por ejemplo, la mayoría de las bibliotecas del sistema operativo están escritas en C en lugar de C++. Así que cada vez que usted está haciendo syscalls de su código C++ para realizar tareas que se entregan al núcleo del sistema operativo, que están pasando a través de llamadas de código C.

Solo asegúrese de incluir las cabeceras adecuadas y el enlace contra las bibliotecas C en cuestión en tiempo de compilación. También recuerde usar extern "C" para especificar el enlace C para las funciones de la biblioteca C si el encabezado los archivos aún no los han declarado como tales. Tenga en cuenta que algunas bibliotecas pueden no haber declarado sus funciones específicamente usando extern "C", pero pueden haber utilizado un token preprocesador para hacerlo. Por lo tanto, querrá verificar eso también antes de asumir que los escritores de la biblioteca no definieron ya su biblioteca como con enlace C.

Vincular bibliotecas personalizadas usando gcc se puede hacer con el conmutador -l. Si necesita especificar un directorio personalizado para dónde se encuentran las bibliotecas, eso se puede hacer con el interruptor -L. Así, por ejemplo:

g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path

Tenga en cuenta que los conmutadores -l y -Lvienen después de el código o los archivos objeto que está compilando, y si su biblioteca es algo como libjpg, o librobotics, etc., suelte la parte lib del nombre cuando la agregue al interruptor -l.

 10
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:42

Puede usar bibliotecas de C desde C++... sin embargo, hay algunas advertencias.

Una gran cosa a tener en cuenta cuando se utilizan bibliotecas de C de terceros con C++ es el manejo de errores.

Algunas bibliotecas C utilizan instalaciones como setjmp/longjmp para el manejo de errores. (lua es un ejemplo notable). Esto significa que en caso de error, el desenrollamiento de la pila no se producirá de la manera normal, y puede filtrar recursos. Cosas como los habituales resguardos de estilo RAII de C++ para la protección de recursos fallan estrepitosamente. (Estas llamadas son peores que goto para código C++).

También las excepciones pueden ser una preocupación. Si una excepción de C++ se propaga a un límite de C/C++, la aplicación puede terminar en lugar de propagar la excepción. (Dependiendo de cómo se compiló la biblioteca C y su sistema operativo, etc.) (Puede obtener esta situación si pasa una función de C++ a una biblioteca de C como devolución de llamada.)

 7
Author: Michael Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 04:59:31

Sí. Para usar la función de biblioteca de C, use extern "C" como se muestra a continuación en su .programa cpp , myprog.cpp

extern "C" {
    // C Function call
    cfunc();
}

int main()
{
    cfunc();
    return 0;
}

Este cfunc debe definirse en la biblioteca de c de la siguiente manera prog.c

#include <stdio.h>

void cfunc()
{
   printf("This is from c library");
}

Luego debe crear .o archivo de objeto y .so archivos de objeto compartidos para su biblioteca de C como se muestra a continuación

$] gcc -c prog.c -o prog
$] gcc -shared -o libprog.so prog.o

$] export LD_LIBRARY_PATH=/path/to/clibrary:$LD_LIBRARY_PATH
$] g++ -L/path/to/clibrary myprog.cpp -o myprog.o -lprog
 6
Author: harper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-07 11:22:22

No se olvide de extern "C" alrededor de los encabezados de la biblioteca. Lea aquí. ¿Cómo funciona "extern" de C?

 5
Author: ssgreg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:17

Yes - C++ puede usar bibliotecas de C.

Este es un ejemplo que usa libc la biblioteca principal de C

#include <cstdio>

int main()
{
   printf("%s\n", "Hello world");
   return 0;
}
 3
Author: Adrian Cornish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 04:31:28

Existe un controlador C++ para los servos Dynamixel en el Framework Rock.

 1
Author: Jakob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-23 08:00:57