C 中呼叫 C靜態函式庫的方法

2021-08-14 05:04:49 字數 3704 閱讀 8872

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...