我正在尝试使用使用 Qt 制作的 GUI 来控制 Dynamixel 伺服系统。Dynamixel 提供了一组C 库来控制电机,而我知道制作 GUI 的唯一方法是 Qt,它本质上是 C++。是否可以以任何方式从 Qt C++ 代码中使用 Dynamixel C 库?
7 回答
是的,C++ 可以使用 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++ 编写的。因此,每当您从 C++ 代码进行系统调用以执行移交给操作系统内核的任务时,这些都是通过 C 代码调用进行的。
只需确保在编译时包含正确的头文件和链接到有问题的 C 库。如果头文件还没有声明它们,还记得使用extern "C"
为 C 库函数指定 C 链接。请记住,某些库可能没有专门使用 声明它们的函数extern "C"
,但可能使用了预处理器令牌来这样做。因此,在假设库编写者尚未将其库定义为具有 C 链接之前,您还需要检查这一点。
gcc
可以使用-l
开关链接自定义库。如果您需要为库所在的位置指定自定义目录,可以使用-L
switch 来完成。例如:
g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path
请注意,-l
and-L
开关位于您正在编译的代码或目标文件之后,如果您的库类似于libjpg
、 或librobotics
等,lib
请在将其附加到-l
开关时删除名称的一部分。
是的。要使用 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
您可以使用 C++ 中的 C 库......但是有一些警告。
将第三方 C 库与 C++ 一起使用时要注意的一件大事是错误处理。
一些 C 库使用setjmp
/之类longjmp
的工具进行错误处理。(lua 是一个显着的例子)。这意味着错误堆栈展开不会以正常方式发生,并且您可能会泄漏资源。诸如用于资源保护的通常 C++ RAII 风格的防护措施都失败了。(这些调用比goto
C++ 代码更糟糕)。
例外情况也可能是一个问题。如果 C++ 异常传播到 C/C++ 边界,则应用程序可能会终止而不是传播异常。(取决于 C 库的编译方式和您的操作系统等)(如果您将 C++ 函数作为回调传递给 C 库,您可能会遇到这种情况。)
不要忘记extern "C"
图书馆标题周围。在这里阅读。C的“外部”是如何工作的?
是的 - C++ 可以使用 C 库。
这是一个使用 libc 主 C 库的示例
#include <cstdio>
int main()
{
printf("%s\n", "Hello world");
return 0;
}
Rock Framework中有一个用于 Dynamixel 伺服系统的C++ 驱动程序。