您的位置:首页 > 编程语言 > C语言/C++

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编译器解释
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: