C++中调用 C静态函数库的方法

C++中调用 C静态函数库的方法

首先,编写静态库函数

/* player.h */
#ifndef __PLAYER_H
#define __PLAYER_H
 
void player_open(char* path);
 
#endif
 
/* player.c */
#include"player.h"
#include<stdio.h>
 
void player_open(char* path)
{
printf("you select file : %s",path);
}
然后,编译成目标文件
[root@MiWiFi-R1CM-srv lllll]# gcc -c player.-o player.o
[root@MiWiFi-R1CM-srv lllll]# ls
main.cpp player.c player.player.o
再然后,打包成静态库
[root@MiWiFi-R1CM-srv lllll]# ar cqs libplayer.a player.o
[root@MiWiFi-R1CM-srv lllll]# ls
libplayer.main.cpp player.c player.h player.o
准备c++测试文件
#include<iostream>
 
extern"C"
{
#include"player.h"
}
 
usingnamespace::std;
 
int main(int argc,char** argv)
{
player_open(argv[1]);
cout<<"you input : "<<argv[1]<<endl;
return0;
}
最后,编译连接
[root@MiWiFi-R1CM-srv lllll]# g++ main.cpp -L.-lplayer -o main
[root@MiWiFi-R1CM-srv lllll]# ls
libplayer.a main main.cpp player.c player.h player.o
[root@MiWiFi-R1CM-srv lllll]#./main ahgkfhaeua
you select file : ahgkfhaeuayou input : ahgkfhaeua
编译的时候 main.cpp 要写在 -Ljjj -ljjj 前边,如果写在后边的话就会报错(不知为何)
[root@MiWiFi-R1CM-srv lllll]# g++-L.-lplayer main.cpp -o main
/tmp/cc6bn6N5.o:Infunction`main':
main.cpp:(.text+0x92): undefined reference to `player_open'
collect2: ld 返回 1
总结:
    c++ 要调用c写成的共享库函数时 要注意在c++文件包含c头文件的时候要写在 extern "C"{} 里边,因为不同编译器解释函数名时并不一样
    下面用nm命令看一下gcc 和g++ 编译出来的库中符号的区别
/* g++ -c player.c -o player.o*/
[root@MiWiFi-R1CM-srv lllll]# nm libplayer.a
 
player.o:
00000018 T _Z11player_openPc
00000006 T _Z11player_stopv
00000000 T _Z12player_pausev
00000012 T _Z16player_setVolumei
0000000c T _Z18player_setSchedulei
U __gxx_personality_v0
U printf
 
[root@MiWiFi-R1CM-srv lllll]# nm libplayerc.a
 
player.o:
00000000 T player_open
0000001b T player_pause
00000025 T player_setSchedule
0000002a T player_setVolume
00000020 T player_stop
U printf
注意 c函数名 play_open  经c++编译后成了 _Z11player_openPc
extern “C”的作用就是 告诉编译器 此段代码用C编译器解释

转载自:http://www.linuxidc.com/Linux/2016-11/137072.htm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值