sintaxis - Uso de bibliotecas C para programas C++
sintaxis de c++ (7)
Estoy tratando de controlar los servos de Dynamixel usando una GUI hecha usando Qt. Dynamixel proporciona un conjunto C de bibliotecas de C para controlar los motores, mientras que la única forma de crear GUI es Qt, que es esencialmente C ++. ¿Será posible utilizar las bibliotecas de Dynamixel C de código Qt C ++ de alguna manera?
Claro ... El código C se llama desde C ++ todo el tiempo. Por ejemplo, la mayoría de las bibliotecas de sistemas operativos están escritas en C en lugar de en C ++. Por lo tanto, siempre que esté realizando syscalls desde su código C ++ para realizar tareas que se entreguen al kernel del sistema operativo, éstas se someten a llamadas de código C.
Solo asegúrese de incluir los encabezados adecuados y el enlace contra las bibliotecas C en cuestión en el momento de la compilación. También recuerde usar extern "C"
para especificar el enlace C para las funciones de la biblioteca C si los archivos de encabezado aún no los han declarado como tales. Tenga en cuenta que es posible que algunas bibliotecas no hayan declarado sus funciones específicamente usando extern "C"
, pero pueden haber usado un token de preprocesador para hacerlo. Así que querrá verificar eso también antes de asumir que los escritores de la biblioteca no definieron su biblioteca como que tiene un enlace-C.
enlazar bibliotecas personalizadas usando gcc
se puede hacer con el -l
. Si necesita especificar un directorio personalizado para la ubicación de las bibliotecas, puede hacerlo con el conmutador -L
. Así, por ejemplo:
g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path
Tenga en cuenta que los modificadores -l
y -L
vienen después del código o los archivos de objetos que está compilando, y si su biblioteca es algo así como libjpg
, o librobotics
, etc., elimine la parte lib
del nombre cuando lo agregue el interruptor -l
Hay un controlador C ++ para los servos de Dynamixel en Rock Framework .
No te olvides de extern "C"
alrededor de los encabezados de la biblioteca. Leer aquí. ¿Cómo funciona el "externo" de C?
Puede usar las bibliotecas de C de C ++ ... sin embargo, hay algunas advertencias.
Una cosa importante a tener en cuenta al usar bibliotecas de terceros C con C ++ es el manejo de errores.
Algunas bibliotecas de C usan instalaciones como setjmp
/ longjmp
para el manejo de errores. (lua es un ejemplo notable). Esto significa que, en caso de error, el desenrollado no se producirá de la manera normal y puede perder recursos. Cosas como las habituales protecciones de estilo C ++ RAII para la protección de recursos fallan de manera lamentable (Estas llamadas son peores que goto
para el 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 de C y de su sistema operativo, etc.) (Podría obtener esta situación si pasa una función de C ++ a una biblioteca de C como devolución de llamada).
Sí, C ++ puede usar las 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;
}
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 c como se muestra a continuación prog.c
#include <stdio.h>
void cfunc()
{
printf("This is from c library");
}
Luego debe crear el archivo de objeto .o
y los archivos de objeto compartidos .so
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
Sí, C ++ puede compilar C con un compilador de C ++ y puede vincular C ++ con C. Solo asegúrese de que cualquier función de C a la que llame utilice el enlace de C. Esto se hace mi adjuntando el prototipo de una extern "C"
#ifdef __cplusplus
extern "C"{
#endif
void c_function_prototype();
#ifdef __cplusplus
}
#endif
Los encabezados de la biblioteca ya pueden hacer eso, por cierto.