Использование библиотек C для программ на C++
Я пытаюсь управлять сервомоторами Dynamixel с помощью GUI, сделанного с использованием Qt. Dynamixel предоставляет набор C библиотеки C для управления двигателями, в то время как единственный способ сделать GUI, который я знаю, - это Qt, который по сути является C++. Можно ли каким-либо образом использовать библиотеки Dynamixel C из кода Qt C++?
7 ответов
да, C++ может компилировать C с компилятором C++, и вы можете связать C++ с C. Просто убедитесь, что любая вызываемая вами функция C использует C-связь. Это сделано моим прилагающим прототипом extern "C"
#ifdef __cplusplus
extern "C"{
#endif
void c_function_prototype();
#ifdef __cplusplus
}
#endif
заголовки для библиотеки уже могут это сделать, кстати.
конечно ... C-код вызывается из C++ все время. Например, большинство библиотек ОС написаны на C, а не на C++. Поэтому всякий раз, когда вы делаете syscalls из своего кода C++ для выполнения задач, которые передаются ядру ОС, они проходят через вызовы C-кода.
просто не забудьте включить соответствующие заголовки и ссылку на рассматриваемые C-библиотеки во время компиляции. Также не забудьте использовать extern "C"
указать с-связь с-библиотечные функции если заголовочные файлы еще не объявили их как таковые. Имейте в виду, что некоторые библиотеки, возможно, не объявили свои функции специально с помощью extern "C"
, но, возможно, использовал токен предварительного процессора для этого. Поэтому вы захотите проверить это, прежде чем предполагать, что авторы библиотеки еще не определили свою библиотеку как имеющую C-связь.
связывание пользовательских библиотек с помощью gcc
можно сделать -l
переключатель. Если вам нужно указать пользовательский каталог для where библиотеки расположены, что можно сделать с помощью -L
переключатель. Так, например:
g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path
отметим, что -l
и -L
переключатели приходят после код или объектные файлы, которые вы компилируете, и если вы библиотека, это что-то вроде libjpg
или librobotics
, etc. бросай lib
часть имени, когда вы добавляете его к -l
переключатель.
вы можете использовать библиотеки C из C++... однако есть некоторые предостережения.
одна большая вещь, чтобы следить при использовании сторонних библиотек C с C++ - это обработка ошибок.
некоторые библиотеки C используют такие средства, как setjmp
/longjmp
для обработки ошибок. (Луа-яркий пример). Это означает, что при ошибке размотка стека не будет происходить обычным образом, и вы можете утечка ресурсов. Такие вещи, как обычные охранники стиля C++ RAII для защиты ресурсов, терпят неудачу. (Эти звонки хуже, чем goto
для кода C++).
также исключения могут быть проблемой. Если исключение c++ распространяется на границу C/C++, приложение может завершиться, а не распространять исключение. (В зависимости от того, как была скомпилирована библиотека C и ваша ОС и т. д.) (Вы можете получить эту ситуацию, если передадите функцию C++ в библиотеку C в качестве обратного вызова.)
да. Чтобы использовать функцию библиотеки C, используйте extern "C", как показано ниже.программа СРР , myprog.cpp
extern "C" {
// C Function call
cfunc();
}
int main()
{
cfunc();
return 0;
}
этот cfunc должен быть определен в библиотеке c, как показано ниже еда.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
Не забывайте про extern "C"
вокруг заголовков библиотеки.
Читать здесь. Как работает "extern" C?
Yes-C++ может использовать библиотеки C.
Это пример, который использует libc основную библиотеку C
#include <cstdio>
int main()
{
printf("%s\n", "Hello world");
return 0;
}