c++中调用 c静态函数库的方法
2015-10-09 19:24
369 查看
此文参考了网友前辈的《extern"C"用法》一文,在此附上链接表示对前辈的尊敬http://www.jianshu.com/p/5d2eeeb93590首先,编写静态库函数
/*player.h*/
#ifndef__PLAYER_H
#define__PLAYER_H
voidplayer_open(char*path);
#endif
/*player.c*/
#include"player.h"
#include<stdio.h>
voidplayer_open(char*path)
{
printf("youselectfile:%s",path);
}然后,编译成目标文件
[root@MiWiFi-R1CM-srvlllll]#gcc-cplayer.c-oplayer.o
[root@MiWiFi-R1CM-srvlllll]#ls
main.cppplayer.cplayer.hplayer.o再然后,打包成静态库
[root@MiWiFi-R1CM-srvlllll]#arcqslibplayer.aplayer.o
[root@MiWiFi-R1CM-srvlllll]#ls
libplayer.amain.cppplayer.cplayer.hplayer.o准备c++测试文件
#include<iostream>
extern"C"
{
#include"player.h"
}
usingnamespace::std;
intmain(intargc,char**argv)
{
player_open(argv[1]);
cout<<"youinput:"<<argv[1]<<endl;
return0;
}最后,编译连接
[root@MiWiFi-R1CM-srvlllll]#g++main.cpp-L.-lplayer-omain
[root@MiWiFi-R1CM-srvlllll]#ls
libplayer.amainmain.cppplayer.cplayer.hplayer.o
[root@MiWiFi-R1CM-srvlllll]#./mainahgkfhaeua
youselectfile:ahgkfhaeuayouinput:ahgkfhaeua编译的时候main.cpp要写在-Ljjj-ljjj前边,如果写在后边的话就会报错(不知为何)
[root@MiWiFi-R1CM-srvlllll]#g++-L.-lplayermain.cpp-omain
/tmp/cc6bn6N5.o:Infunction`main':
main.cpp:(.text+0x92):undefinedreferenceto`player_open'
collect2:ld返回1总结:c++要调用c写成的共享库函数时要注意在c++文件包含c头文件的时候要写在extern"C"{}里边,因为不同编译器解释函数名时并不一样下面用nm命令看一下gcc和g++编译出来的库中符号的区别
/*g++-cplayer.c-oplayer.o*/
[root@MiWiFi-R1CM-srvlllll]#nmlibplayer.a
player.o:
00000018T_Z11player_openPc
00000006T_Z11player_stopv
00000000T_Z12player_pausev
00000012T_Z16player_setVolumei
0000000cT_Z18player_setSchedulei
U__gxx_personality_v0
Uprintf
[root@MiWiFi-R1CM-srvlllll]#nmlibplayerc.a
player.o:
00000000Tplayer_open
0000001bTplayer_pause
00000025Tplayer_setSchedule
0000002aTplayer_setVolume
00000020Tplayer_stop
Uprintf注意c函数名play_open经c++编译后成了_Z11player_openPcextern“C”的作用就是告诉编译器此段代码用C编译器解释
相关文章推荐
- C++运算符
- C语言宏与单井号(#)和双井号(##)
- 一段时间内两次买进卖出股票使得收益最大(C++版)
- pip 安装 zkpython时报错“error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat)”
- 【leetcode c++】160 Intersection of Two Linked Lists
- c++11 遍历与随机数
- 【leetcode c++】155 Min stack
- 调节系统音量VC++(适合win和xp系统) 打开静音 增减和减小系统音量
- 【leetcode c++】125 Valid Palindrome
- 【leetcode c++】118 Pascal's Triangle
- 数组的深入理解之p=&(b+1)[5]
- UE4为什么使用C++替代UnrealScript?
- C++设计模式——原型模式
- C++STL之vector
- C语言经典笔试题(一)
- c++笔试
- 【C语言】输出字符串
- Python3.4与c/c++联调----ctypes
- libxml2编程--C语言xml初使用(2)
- libxml2编程--C语言xml初使用(2)