Подтвердить что ты не робот

Использование библиотек C для программ на С++

Я пытаюсь контролировать сервомашины Dynamixel, используя GUI, созданный с помощью Qt. Dynamixel предоставляет набор C C-библиотек для управления моторами, в то время как единственный способ сделать GUI, который я знаю, это Qt, который по существу является С++. Можно ли каким-либо образом использовать библиотеки Dynamixel C от Qt С++?

4b9b3361

Ответ 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

Ответ 6

Да - С++ может использовать библиотеки C.

Это пример, который использует libc в основной библиотеке C

#include <cstdio>

int main()
{
   printf("%s\n", "Hello world");
   return 0;
}