tipos sintaxis programas funciones ejemplos dev datos comandos codigos basicos c++ c robotics

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




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.