最近被问到自己常用什么语言编程,我说用C语言,然后被问你做嵌入式的C怎样调用C++库,这个问题还真没想过,查阅资料整理了下。
准备了两个文件test.h、test.c
test.h
#ifndef __TEST_H__
#define __TEST_H__
int add(int a, int b);
#endif
test.c
#include "test.h"
int add(int a, int b)
{
return (a + b);
}
熟悉的人都知道C++函数重载编译时会带参数类型,和C语言编译生成的函数会不一样。习惯用CMakeLists.txt去编译程序,然后文件名也用的“.cpp”(cc),在编译时会使用g++编译器,不涉及到C++调用C的问题,可以直接调用。若果文件名用的“.c”,使用CMakeLists.txt编译时会使用gcc编译器,生成的so不能直接被g++编译器直接调用,应用程序在引用“test.h”头文件时需做如下处理,告诉编译器这段代码用C语言编译。
#ifdef __cplusplus
extern "C"{
#include "test.h"
}
#endif
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("%d + %d = %d\n", a, b, add(a, b));
return 0;
}
同样的,如果用C语言调用C++库,需要对C++库头文件做如下处理(调用别人的库需要二次封装,引用第三方库头文件时做同样处理,并使用g++编译)。
#ifndef __TEST_HPP__
#define __TEST_HPP__
#ifdef __cplusplus
extern "C"{
int add(int a, int b);
}
#endif
#endif
原谅我这个老菜鸟平时没有注意那么多细节,只是觉得自己用的就是C语言,在CMakeLists.txt非常好用的情况下,没有关心编译细节问题。简单记录了下自己的心得,描述不准确的地方大家批评指正。