1. C++代码及C主进程代码
- c++程序代码test.cc
1 2 3 4 5 6 7 |
//test.cc #include "test.h" #include <iostream> using namespace std; void fun(){ std::cout<<"Execute C++ fun!"<<std::endl; } |
- 头文件test.h这个文件为C代码直接调用头文件,不要存在任何C++相关代码;
- 添加宏定义
#ifdef __cplusplus extern "C" { #endif
便于在c和c++代码中引用该头文件。
1 2 3 4 5 6 7 8 9 10 11 |
//test.h #ifndef TEST_HEADER #define TEST_HEADER #ifdef __cplusplus extern "C" { #endif void fun(); #ifdef __cplusplus } #endif #endif |
-
main主进程代码
-
这里需要添加extern void fun(),能够找到C++源码中以C编译的该函数;
1 2 3 4 5 6 7 8 9 10 11 |
//main.c #include <stdio.h> #include "test.h" extern void fun(); void main(){ fun(); printf("Execute C main!\n"); return ; } |
2. 编译和链接
- 步骤一:编译C++方法,执行命令
- 报错“在函数‘_start’中:(.text+0x20):对‘main’未定义的引用”
这里需要添加-c参数,告诉编译器,编译、汇编到目标代码test.o,不进行链接;
1 |
g++ -c test.cc -o test.o |
- 步骤二:方法一 gcc生成可执行文件
1 2 3 4 |
gcc -c main.c -o main.o gcc -o main main.o test.o -lstdc++ #或者以上两行命令合并,直接生成主程序进程 gcc -o main main.c test.o -lstdc++ |
- 步骤二:方法二 生成静态库并gcc进行链接
1 2 3 4 5 |
#链接为静态库 ar rs libtest.a test.o #这里面-L路径为libtest.a文件所在路径,也可是相对路径; #注意-lstdc++等标准库或被依赖的库要放在后面,即-l要依次依赖后面的库; gcc -o main main.c -L/root/workspace/test -ltest -lstdc++ |
- 结果输出
1 2 3 |
$ ./main Execute C++ fun! Execute C main! |
微信赞赏
支付宝赞赏