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

如何在共享库(c-linux)中访问可执行文件的全局变量,c,linux,shared-libraries,C,Linux,Shared Libraries,我想访问共享库中可执行文件的全局变量?我曾尝试使用option-export-dynamic进行编译,但没有成功 我试过使用extern关键字。这也不起作用 任何帮助或建议都是值得赞赏的 环境c-Linux 可执行文件:- tst.c 库:- tstLib.c 由于我的代码非常大,我只给出了我在程序中使用的示例。它应该可以工作。顺便说一句,您的tst.c缺少#include。其main应返回int并以例如返回0结尾 与 我使用gcc-Wall-ctst.c第一个文件编译,使用gcc-Wall-c

我想访问共享库中可执行文件的全局变量?我曾尝试使用option-export-dynamic进行编译,但没有成功

我试过使用extern关键字。这也不起作用

任何帮助或建议都是值得赞赏的

环境c-Linux

可执行文件:- tst.c

库:- tstLib.c


由于我的代码非常大,我只给出了我在程序中使用的示例。

它应该可以工作。顺便说一句,您的
tst.c
缺少
#include
。其
main
应返回
int
并以例如
返回0结尾

我使用
gcc-Wall-ctst.c
第一个文件编译,使用
gcc-Wall-ctstlib.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.c
tstlib.c
都包含
#include“tstlib.h”

如果库是共享的,您应该

  • 以独立于位置的代码模式编译库文件

    gcc -Wall -fpic -c tstlib.c -o tstlib.pic.o
    
  • 使用
    -shared

    gcc -shared tstlib.pic.o -o libtst.so
    
    请注意,您可以将共享对象链接到其他库。如果您的
    tstlib.c
    正在调用
    gdbm\u open
    ,因此包含
    ,则可以将
    -lgdbm
    附加到该命令中。这是共享库为您提供的静态库所没有的许多特性之一

  • 将可执行文件链接到
    -rdynamic

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

  • 请花时间阅读

    您的tstVar变量可以在库中定义。您可以通过函数共享此变量:
    setFunction
    :编辑此变量

    void setFunction (int v)
    {
        tstVar = v;
    }
    
    getFunction
    :返回变量

    int getFunction ()
    {
        return tstVar
    }
    

    你是如何尝试
    extern
    关键字的?。它起作用了。给我们看看代码。@TioPepe我刚刚添加了示例代码:)您有什么问题?如果有,您会收到什么错误消息?你是如何建立图书馆的?如何构建可执行文件?
    gcc -shared tstlib.pic.o -o libtst.so
    
    gcc -rdynamic tst.o -L. -ltst -o tst
    
    void setFunction (int v)
    {
        tstVar = v;
    }
    
    int getFunction ()
    {
        return tstVar
    }