Использование библиотек 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;
}

есть драйвер C++ для сервоприводов Dynamixel в Рок Структуры.