c++中呼叫 c靜態函式庫的方法
首先,編寫靜態庫函式
/* player.h */
#ifndef
__player_h
#define
__player_h
void player_open
(char
*path
);
#endif
/* player.c */
#include
"player.h"
#include
void
player_open
(char
*path
)
然後,編譯成目標檔案
[
root@miwifi
-r1cm
-srv lllll
]#gcc
-c player.c
-o player
.o[
root@miwifi
-r1cm
-srv lllll
]#ls
main
.cpp player
.c player
.h player.o
再然後,打包成靜態庫
[
root@miwifi
-r1cm
-srv lllll
]#ar cqs libplayer
.a player
.o[
root@miwifi
-r1cm
-srv lllll
]#ls
libplayer
.a main
.cpp player
.c player
.h player
.o
準備c++測試檔案
#include
extern
"c"
using
namespace
::std
;
int
main
(int
argc
,char
**argv
)
最後,編譯連線
[
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編譯器解釋
本文永久更新鏈結位址:
靜態函式庫與動態函式庫的設計
函式庫存放位置 linux應用程式使用的主要函式均放在 lib和 usr lib目錄下,其中採用 so.命名的是動態函式庫,而以 a方式命名的是靜態函式庫。靜態函式庫的特點 程式所要用到的庫函式 在鏈結時全部被copy到程式中。導致的問題 如果有多個程序在記憶體中同時執行,並且使用了相同的函式庫,那...
Linux 下的靜態(函式)庫 動態(函式)庫
不用指定生成.o檔名 預設生成file1.o,file2.o,file3.o ar rv libname.a file1.o file2.o file3.or 將flie1.o,file2,o,file3.o插入archive,如故原先archive中已經存在某檔案,則先將該檔案刪除。v 顯示ar操...
Linux的靜態函式庫和動態函式庫
一 在linux中,有兩種函式庫,以 so字尾命名的是動態函式庫,以 a字尾命名的是靜態函式庫 二 靜態函式庫 1 靜態函式庫是多個目標檔案 o的集合 2 可以使用ar命令 archiver 來生成.a檔案 gcc c part a.c gcc c part b.c ar r libtest.a p...