在C ++程序中使用C库

问题描述 投票:40回答:7

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

c++ c robotics
7个回答
53
投票

是的,C ++可以使用C ++编译器编译C,并且可以将C ++与C链接。只需确保调用的任何C函数都使用C链接。这是通过用extern "C"

包围C函数的原型来完成的
#ifdef __cplusplus
extern "C"{
#endif 

void c_function_prototype();

#ifdef __cplusplus
}
#endif

您尝试使用的库的标题可能已经做到了。


13
投票

确定...始终从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您正在编译的代码或目标文件,如果您使用的库是-Llibjpg等,将名称附加到librobotics开关时,请删除名称的lib部分。


8
投票

是。要使用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

7
投票

您可以使用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库中,则可能会遇到这种情况。)


5
投票

不要忘记库标题周围的goto。在这里阅读。 extern "C"


3
投票

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

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

How does C's "extern" work?

2
投票

#include <cstdio> int main() { printf("%s\n", "Hello world"); return 0; } 中有Dynamixel伺服器的C++ driver

© www.soinside.com 2019 - 2024. All rights reserved.