如何在共享库中访问可执行文件的全局变量(c - linux)

时间:2012-01-30 07:36:12

标签: c linux shared-libraries

我想在共享库中访问可执行文件的全局变量?我尝试使用选项-export-dynamic进行编译,但没有运气。

我尝试过extern关键词。这也行不通。

任何帮助或建议都会令人感激。

环境c - Linux

可执行: - tst.c

int tstVar = 5;

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

LIB: - tstLib.c

extern int tstVar;

void funInso(){
   tstVar = 50;
}

由于我的代码很大,我只是提供了我在程序中使用过的样本。

2 个答案:

答案 0 :(得分: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

将第一个文件链接到库

通常的做法是在库中添加一个包含例如<。p>的头文件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
    

    请注意,您可以将共享对象与其他库链接。如果您的-lgdbm是例如,则可以将tstlib.c附加到该命令调用gdbm_open因此包括<gdbm.h>。这是共享库为静态库提供的许​​多功能之一。

  3. 将可执行文件与-rdynamic

    相关联
    gcc -rdynamic tst.o -L. -ltst -o tst
    
  4. 请花点时间阅读Program Library Howto

答案 1 :(得分:-1)

你的tstVar变量可以在lib中定义。你可以通过函数分享这个变量: setFunction:编辑此变量

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

getFunction:返回变量

int getFunction ()
{
    return tstVar
}