使用C库进行C ++程序

时间:2012-08-22 04:23:57

标签: c++ c robotics

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

7 个答案:

答案 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伺服器。