Я пытаюсь контролировать сервомашины Dynamixel, используя GUI, созданный с помощью Qt. Dynamixel предоставляет набор C C-библиотек для управления моторами, в то время как единственный способ сделать GUI, который я знаю, это Qt, который по существу является С++. Можно ли каким-либо образом использовать библиотеки Dynamixel C от Qt С++?
Использование библиотек C для программ на С++
Ответ 1
Да, С++ может скомпилировать C с компилятором С++, и вы можете связать С++ с C. Просто убедитесь, что любая функция C, которую вы вызываете, использует C-ссылку. Это сделало мою оболочку прототипом extern "C"
#ifdef __cplusplus
extern "C"{
#endif
void c_function_prototype();
#ifdef __cplusplus
}
#endif
Заголовки библиотеки могут уже делать это, BTW.
Ответ 2
Конечно... C код вызывается из С++ все время. Например, большинство библиотек ОС написаны на C, а не на С++. Поэтому всякий раз, когда вы делаете системные вызовы из своего кода на С++ для выполнения задач, передаваемых ядру ОС, они проходят через вызовы с C-кодом.
Просто не забудьте включить соответствующие заголовки и ссылку на соответствующие библиотеки C во время компиляции. Также не забудьте использовать extern "C"
, чтобы указать C-linkage для функций C-библиотеки, если заголовочные файлы еще не объявили их как таковые. Имейте в виду, что некоторые библиотеки, возможно, не указали свои функции специально с помощью extern "C"
, но, возможно, использовали токен перед процессором. Поэтому вы также захотите проверить это, прежде чем вы предполагаете, что библиотекаторы еще не определили свою библиотеку как C-linkage.
Связывание пользовательских библиотек с помощью gcc
может быть выполнено с помощью переключателя -l
. Если вам нужно указать пользовательский каталог, где расположены библиотеки, это можно сделать с помощью переключателя -l
. Так, например:
g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path
Обратите внимание, что переключатели -l
и -l
появляются после файлов кода или объектов, которые вы компилируете, и если вы являетесь библиотекой, это что-то вроде libjpg
или librobotics
и т.д., отпустите lib
часть имени, когда вы добавляете его в переключатель -l
.
Ответ 3
Вы можете использовать библиотеки C из С++... однако есть некоторые оговорки.
Одна большая вещь, чтобы следить за использованием сторонних библиотек C с С++, - это обработка ошибок.
В некоторых библиотеках C для обработки ошибок используются средства, такие как setjmp
/longjmp
. (lua - заметный пример). Это означает, что при сбое стека ошибок обычное обращение не происходит, и вы можете утечки ресурсов. Такие вещи, как обычные защитные элементы стиля С++ RAII для защиты ресурсов, терпят неудачу. (Эти коды хуже, чем goto
для кода С++).
Также возможны исключения. Если исключение С++ распространяется на границу C/С++, приложение может прекратить, а не распространять исключение. (В зависимости от того, как была скомпилирована библиотека C и ваша ОС и т.д.) (Вы можете получить эту ситуацию, если передать функцию С++ в библиотеку C в качестве обратного вызова.)
Ответ 4
Да. Для использования функции библиотеки C используйте extern "C", как показано ниже в вашей программе .cpp , myprog.cpp
extern "C" {
// C Function call
cfunc();
}
int main()
{
cfunc();
return 0;
}
Этот cfunc должен быть определен в c-библиотеке, как показано ниже prog.c
#include <stdio.h>
void cfunc()
{
printf("This is from c library");
}
Затем вам нужно создать объектный файл .o
и .so
файлы общих объектов для вашей библиотеки C, как показано ниже
$] 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
Ответ 5
Не забывайте о extern "C"
вокруг заголовков библиотеки.
Читайте здесь. Каким образом C 'extern " работать?
Ответ 6
Да - С++ может использовать библиотеки C.
Это пример, который использует libc в основной библиотеке C
#include <cstdio>
int main()
{
printf("%s\n", "Hello world");
return 0;
}
Ответ 7
Существует драйвер С++ для сервомашин Dynamixel в Rock Framework.