首页 / 操作系统 / Linux / 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.c -o player.o[root@MiWiFi-R1CM-srv lllll]# lsmain.cpp player.c player.h player.o再然后,打包成静态库[root@MiWiFi-R1CM-srv lllll]# ar cqs libplayer.a player.o[root@MiWiFi-R1CM-srv lllll]# lslibplayer.a 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]# lslibplayer.a main main.cpp player.c player.h player.o[root@MiWiFi-R1CM-srv lllll]#./main ahgkfhaeuayou 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_openPc00000006 T _Z11player_stopv00000000 T _Z12player_pausev00000012 T _Z16player_setVolumei0000000c T _Z18player_setScheduleiU __gxx_personality_v0U printf [root@MiWiFi-R1CM-srv lllll]# nm libplayerc.a player.o:00000000 T player_open0000001b T player_pause00000025 T player_setSchedule0000002a T player_setVolume00000020 T player_stopU printf注意 c函数名 play_open 经c++编译后成了 _Z11player_openPc extern “C”的作用就是 告诉编译器 此段代码用C编译器解释本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137072.htm