C語言 呼叫的動態庫函式重名問題分析

2021-07-11 01:41:09 字數 2393 閱讀 5371

設計兩個動態庫

第乙個動態庫:libhelloc:

func1.h

#ifndef func1_h_

#define func1_h_

int func1();

void func();

#endif

func1.c

#include "func1.h"

int func1()

void func()

libhelloc.h

#ifndef libhelloc_h

#define libhelloc_h

#include "stdio.h"

void print_hello ();

void test1();

#endif

libhelloc.c

#include "libhelloc.h"

#include "func1.h"

void print_hello()

void test1()

第二個動態庫libhelloc2:

func1.h

#ifndef func1_h_

#define func1_h_

int func1();

void func();

#endif

func2.c

#include "func1.h"

int func1()

void func()

libhelloc2.h

#ifndef libhelloc2_h

#define libhelloc2_h

#include "stdio.h"

void print_hello2 ();

void test2();

#endif

libhelloc2.c

#include "libhelloc2.h"

#include "func1.h"

void print_hello2()

void test2()

設計可執行程式:

helloc.c

#include #include #include "func1.h"

#include "func2.h"

#include #include int main(void)

當makefile.am 內容為

bin_programs=a.out

a_out_sources=helloc.c

am_cflags= -i/usr/local/include -lhelloc -lhelloc2 -l/usr/local/lib

a.out 輸出:

!!!hello world!!!

func at libhelloc

invode func1:0

func at libhelloc

invode func1:0

func at libhelloc

invode func1:0

當makefile.am內容為:

bin_programs=a.out

a_out_sources=helloc.c

am_cflags= -i/usr/local/include -lhelloc2 -lhelloc -l/usr/local/lib

a.out輸出:

!!!hello world!!!

func at libhelloc2

invode func1:10

func at libhelloc2

invode func1:10

func at libhelloc2

invode func1:10

總結:當乙個程式引用的兩個動態庫中存在同名函式時,先被載入的動態庫函式有效,後家在的動態庫同名函式無效(不會被執行)。並且後載入的動態庫中其他函式呼叫了同名函式時,原本期望是呼叫本動態庫中的函式,事實上呼叫的是第乙個被載入的動態庫中的同名函式。這樣極有可能造成一些難以理解的程式,因此應當極力避免這種情況發生!

如 com_hknaruto_demo_libjni.c 其中的函式及全劇變數均採用com_hknaruto_demo_libjni_字首。

c語言函式重名問題

問題 linux下程式鏈結動態c庫總是失敗,提示庫中的幾個函式出現問題。苦找無果,最後發現原因 庫內兩個c函式重名。結論 最好不要重名,但可以通過一些限制避免這個問題。提問 c語言 可以函式過載嗎?answer 可以實現。我參考了幾種說法。1,c語言不支援函式過載。同一作用區域不可以有函式重名,但不...

C 動態呼叫共享庫函式

1.需求.我們需要呼叫乙個函式 std string getvalue int index 這個函式定義在庫t1.so裡面 2.t1.so cat t1.c include extern c std string getvalue int index cc g t1.c o t1.so 3.用法 c...

qt呼叫c語言函式庫 C 呼叫C語言的庫函式

在專案中,使用c語言編寫了乙個socket後台程式tkcofferd,並且為方便客戶端的使用,提供了動態庫,其中包含socket介面。現在的需求是使用qt做乙個前端介面,用來展示tkcofferd的socket介面功能,用於測試目的。qt中使用c 語言編寫,如果需要呼叫tkcofferd的socke...