51

我正在尝试使用使用 Qt 制作的 GUI 来控制 Dynamixel 伺服系统。Dynamixel 提供了一组C 库来控制电机,而我知道制作 GUI 的唯一方法是 Qt,它本质上是 C++。是否可以以任何方式从 Qt C++ 代码中使用 Dynamixel C 库?

4

7 回答 7

68

是的,C++ 可以使用 C++ 编译器编译 C,并且您可以将 C++ 与 C 链接起来。只要确保您调用的任何 C 函数都使用 C 链接即可。这是通过将 C 函数的原型用一个extern "C"

#ifdef __cplusplus
extern "C"{
#endif 

void c_function_prototype();

#ifdef __cplusplus
}
#endif

您尝试使用的库的标头可能已经这样做了。

于 2012-08-22T04:32:49.853 回答
20

当然... C 代码一直是从 C++ 调用的。例如,大多数操作系统库都是用 C 而不是 C++ 编写的。因此,每当您从 C++ 代码进行系统调用以执行移交给操作系统内核的任务时,这些都是通过 C 代码调用进行的。

只需确保在编译时包含正确的头文件和链接到有问题的 C 库。如果头文件还没有声明它们,还记得使用extern "C"为 C 库函数指定 C 链接。请记住,某些库可能没有专门使用 声明它们的函数extern "C",但可能使用了预处理器令牌来这样做。因此,在假设库编写者尚未将其库定义为具有 C 链接之前,您还需要检查这一点。

gcc可以使用-l开关链接自定义库。如果您需要为库所在的位置指定自定义目录,可以使用-Lswitch 来完成。例如:

g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path

请注意,-land-L开关位于您正在编译的代码或目标文件之后,如果您的库类似于libjpg、 或librobotics等,lib请在将其附加到-l开关时删除名称的一部分。

于 2012-08-22T04:29:40.473 回答
11

是的。要使用 C 库函数,请在 .cpp 程序 myprog.cpp 中使用如下所示的 extern "C"

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");
}

然后您需要为您的 C 库创建.o目标文件和共享目标文件,如下所示.so

$] 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
于 2015-03-07T10:46:51.387 回答
8

您可以使用 C++ 中的 C 库......但是有一些警告。

将第三方 C 库与 C++ 一起使用时要注意的一件大事是错误处理。

一些 C 库使用setjmp/之类longjmp的工具进行错误处理。(lua 是一个显着的例子)。这意味着错误堆栈展开不会以正常方式发生,并且您可能会泄漏资源。诸如用于资源保护的通常 C++ RAII 风格的防护措施都失败了。(这些调用比gotoC++ 代码更糟糕)。

例外情况也可能是一个问题。如果 C++ 异常传播到 C/C++ 边界,则应用程序可能会终止而不是传播异常。(取决于 C 库的编译方式和您的操作系统等)(如果您将 C++ 函数作为回调传递给 C 库,您可能会遇到这种情况。)

于 2012-08-22T04:59:31.017 回答
6

不要忘记extern "C"图书馆标题周围。在这里阅读。C的“外部”是如何工作的?

于 2012-08-22T04:33:15.417 回答
3

是的 - C++ 可以使用 C 库。

这是一个使用 libc 主 C 库的示例

#include <cstdio>

int main()
{
   printf("%s\n", "Hello world");
   return 0;
}
于 2012-08-22T04:29:24.470 回答
2

Rock Framework中有一个用于 Dynamixel 伺服系统的C++ 驱动程序

于 2012-08-23T08:00:57.913 回答