2012-01-30 63 views
0

我想訪問共享庫中可執行文件的全局變量嗎?我試圖使用選項-export-dynamic進行編譯,但沒有運氣。如何訪問共享庫中可執行文件的全局變量(c-linux)

我試過用extern關鍵詞。這也不起作用。

任何幫助或建議都是可觀的。

環境Ç - Linux的

可執行: - tst.c

int tstVar = 5; 

void main(){ 
funInso(); 
    printf("tstVar %d", tstVar); 
} 

lib目錄下: - tstLib.c

extern int tstVar; 

void funInso(){ 
    tstVar = 50; 
} 

因爲我的代碼是非常大的,我只是給了我在程序中使用的樣本。

+0

你怎麼嘗試'extern'關鍵字?有用。向我們展示代碼。 – 2012-01-30 07:39:10

+0

@TioPepe我剛剛添加了示例代碼:) – Thangaraj 2012-01-30 07:46:12

+2

你有什麼問題?如果有的話,你會得到什麼錯誤消息?你如何建立圖書館?你如何構建可執行文件? – 2012-01-30 07:49:47

回答

2

它應該工作。順便說一句,你的tst.c缺少#include <stdio.h>。其main應返回ìnt並以例如return 0;

隨着

/* file tst.c */ 
#include <stdio.h> 
int tstVar = 5; 
extern void funInso(void); 

int main(){ 
    funInso(); 
    printf("tstVar %d\n", tstVar); 
    return 0; 
} 

/* file tstlib.c */ 
extern int tstVar; 

void funInso(){ 
    tstVar = 50; 
} 

gcc -Wall -c tst.c編制的第一個文件,我gcc -Wall -c tstlib.c第二個文件編制。我

ar r libtst.a tstlib.o 
ranlib libtst.a 

使其成爲庫,然後我聯繫的第一個文件到庫gcc -Wall tst.o -L. -ltst -o tst

通常的做法是讓你的庫中的頭文件tstlib.h其中將包括如

#ifndef TSTLIB_H_ 
#define TSTLIB_H_ 
/* a useful explanation about tstVar. */ 
extern int tstVar; 

/* the role of funInso. */ 
extern void funInso(void); 
#endif /*TSTLIB_H */ 

,並同時擁有tst.ctstlib.c包含#include "tstlib.h"

如果磁帶庫共享,你應該

  1. 編譯位置無關的代碼模式庫文件

    gcc -Wall -fpic -c tstlib.c -o tstlib.pic.o 
    
  2. 鏈接與-shared

    gcc -shared tstlib.pic.o -o libtst.so 
    

    請注意,您可以鏈接共享對象與其他庫。如果您的tstlib.c是例如您可能已附加-lgdbm該命令致電gdbm_open因此包括<gdbm.h>。這是共享庫爲靜態庫所不具備的許多功能之一。

  3. 鏈接的可執行文件-rdynamic

    gcc -rdynamic tst.o -L. -ltst -o tst 
    

請花時間閱讀可以在lib目錄中定義的Program Library Howto

-1

您tstVar變量。您可以通過共享功能,這個變量: setFunction:編輯這個變量

void setFunction (int v) 
{ 
    tstVar = v; 
} 

getFunction:返回變量

int getFunction() 
{ 
    return tstVar 
}