我正在尝试使用使用Qt制作的GUI控制Dynamixel伺服器。 Dynamixel提供了一组C C libraries来控制电动机,而使GUI唯一的方法就是Qt,它实际上是C ++。是否可以以任何方式使用来自Qt C ++代码的Dynamixel C库?
是的,C ++可以使用C ++编译器编译C,并且可以将C ++与C链接。只需确保调用的任何C函数都使用C链接。这是通过用extern "C"
#ifdef __cplusplus
extern "C"{
#endif
void c_function_prototype();
#ifdef __cplusplus
}
#endif
您尝试使用的库的标题可能已经做到了。
确定...始终从C ++调用C代码。例如,大多数OS库都是用C而不是C ++编写的。因此,每当您从C ++代码进行系统调用以执行移交给OS内核的任务时,这些任务都将通过C代码调用。
只需确保在编译时包含适当的头文件并链接到有问题的C库。同样要记住,如果头文件尚未声明为C库函数,请使用extern "C"
指定C链接。请记住,某些库可能未专门使用extern "C"
声明其功能,但可能已使用预处理器令牌声明了它们。因此,在假定库编写者尚未将其库定义为具有C链接之前,您还需要进行检查。
使用extern "C"
链接自定义库可以通过gcc
开关完成。如果需要为库所在的位置指定自定义目录,可以使用-l
开关来完成。因此,例如:
-L
请注意,g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path
和-l
开关来自after您正在编译的代码或目标文件,如果您使用的库是-L
或libjpg
等,将名称附加到librobotics
开关时,请删除名称的lib
部分。
是。要使用C库函数,请在.cpp程序中使用extern“ C”,如下所示,myprog.cpp
-l
此cfunc应该在c库中定义如下编[c
extern "C" {
// C Function call
cfunc();
}
int main()
{
cfunc();
return 0;
}
然后您需要如下所示为C库创建#include <stdio.h>
void cfunc()
{
printf("This is from c library");
}
目标文件和.o
共享目标文件
.so
您可以使用C ++中的C库...但是有一些警告。
与C ++一起使用第三方C库时要注意的一件大事是错误处理。
某些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
/ setjmp
之类的工具进行错误处理。 (lua是一个明显的例子)。这意味着在错误堆栈上将不会以正常方式展开,并且您可能会泄漏资源。诸如用于资源保护的常规C ++ RAII样式防护之类的操作失败。 (对于C ++代码,这些调用比longjmp
更糟糕。
也可以考虑例外情况。如果C ++异常传播到C / C ++边界,则应用程序可能会终止而不是传播该异常。 (取决于C库的编译方式以及您的OS等)(如果将C ++函数作为回调传递到C库中,则可能会遇到这种情况。)
不要忘记库标题周围的goto
。在这里阅读。 extern "C"
#include <cstdio>
int main()
{
printf("%s\n", "Hello world");
return 0;
}
中有Dynamixel伺服器的C++ driver。