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