J'essaie de contrôler les servos Dynamixel en utilisant une interface graphique faite en utilisant Qt. Dynamixel fournit un ensemble C de bibliothèques C pour contrôler les moteurs, tandis que la seule façon de créer des GUI que je connaisse est Qt, qui est essentiellement C++. Sera-t-il possible d'utiliser les bibliothèques Dynamixel C à partir du code Qt C++ de quelque manière que ce soit?
Oui, C++ peut compiler C avec un compilateur C++ et vous pouvez lier C++ à C. Assurez-vous simplement que toute fonction C que vous appelez utilise la liaison C. Ceci est fait mon enfermant le prototype d'un extern "C"
#ifdef __cplusplus
extern "C"{
#endif
void c_function_prototype();
#ifdef __cplusplus
}
#endif
Les en-têtes de la bibliothèque peuvent déjà le faire, BTW.
Bien sûr ... Le code C est appelé depuis C++ tout le temps. Par exemple, la plupart des bibliothèques OS sont écrites en C plutôt qu'en C++. Ainsi, chaque fois que vous effectuez des appels système à partir de votre code C++ pour effectuer des tâches qui sont transmises au noyau du système d'exploitation, celles-ci passent par des appels de code C.
Assurez-vous simplement d'inclure les en-têtes appropriés et le lien avec les bibliothèques C en question au moment de la compilation. N'oubliez pas non plus d'utiliser extern "C"
pour spécifier la liaison C pour les fonctions de la bibliothèque C si les fichiers d'en-tête ne les ont pas déjà déclarés comme tels. Gardez à l'esprit que certaines bibliothèques peuvent ne pas avoir déclaré leurs fonctions spécifiquement en utilisant extern "C"
, mais peut avoir utilisé un jeton de pré-processeur pour ce faire. Vous devrez donc vérifier cela avant de supposer que les rédacteurs de bibliothèque n'ont pas déjà défini leur bibliothèque comme ayant un lien C.
la liaison de bibliothèques personnalisées à l'aide de gcc
peut être effectuée avec le -l
commutateur. Si vous devez spécifier un répertoire personnalisé pour l'emplacement des bibliothèques, cela peut être fait avec le -L
commutateur. Ainsi, par exemple:
g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path
Notez que le -l
et -L
les commutateurs viennent après le code ou les fichiers objets que vous compilez, et si votre bibliothèque est quelque chose comme libjpg
, ou librobotics
, etc., supprimez la partie lib
du nom lorsque vous l'ajoutez à la -l
commutateur.
Oui. Pour utiliser la fonction de bibliothèque C, utilisez extern "C" comme ci-dessous dans votre programme .cpp, myprog.cpp
extern "C" {
// C Function call
cfunc();
}
int main()
{
cfunc();
return 0;
}
Ce cfunc doit être défini dans la bibliothèque c comme ci-dessous prog.c
#include <stdio.h>
void cfunc()
{
printf("This is from c library");
}
Ensuite, vous devez créer .o
fichier objet et .so
fichiers d'objets partagés pour votre bibliothèque C comme ci-dessous
$] 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
Vous pouvez utiliser les bibliothèques C de C++ ... mais il y a quelques mises en garde.
Une grande chose à surveiller lors de l'utilisation de bibliothèques C tierces avec C++ est la gestion des erreurs.
Certaines bibliothèques C utilisent des fonctionnalités telles que setjmp
/longjmp
pour la gestion des erreurs. (lua est un exemple notable). Cela signifie qu'en cas d'erreur, le déroulement de la pile ne se produira pas normalement et vous risquez de perdre des ressources. Des choses comme les gardes de style C++ RAII habituelles pour la protection des ressources échouent lamentablement. (Ces appels sont pires que goto
pour le code C++).
Les exceptions peuvent également être un sujet de préoccupation. Si une exception C++ se propage à une limite C/C++, l'application peut se terminer plutôt que propager l'exception. (Selon la façon dont la bibliothèque C a été compilée et votre système d'exploitation, etc.) (Vous pouvez obtenir cette situation si vous passez une fonction C++ dans une bibliothèque C en tant que rappel.)
N'oubliez pas extern "C"
autour des en-têtes de bibliothèque. Lisez ici. Comment fonctionne "l'externe" de C?
Oui - C++ peut utiliser des bibliothèques C.
Ceci est un exemple qui utilise libc la bibliothèque C principale
#include <cstdio>
int main()
{
printf("%s\n", "Hello world");
return 0;
}
Il y a un pilote C++ pour les servos Dynamixel dans le Rock Framework .