設計兩個動態庫
第乙個動態庫: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...