我想在共享库中访问可执行文件的全局变量?我尝试使用选项-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;
}
由于我的代码很大,我只是提供了我在程序中使用过的样本。
答案 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.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
请注意,您可以将共享对象与其他库链接。如果您的-lgdbm
是例如,则可以将tstlib.c
附加到该命令调用gdbm_open
因此包括<gdbm.h>
。这是共享库为静态库提供的许多功能之一。
将可执行文件与-rdynamic
gcc -rdynamic tst.o -L. -ltst -o tst
请花点时间阅读Program Library Howto
答案 1 :(得分:-1)
你的tstVar变量可以在lib中定义。你可以通过函数分享这个变量:
setFunction
:编辑此变量
void setFunction (int v)
{
tstVar = v;
}
getFunction
:返回变量
int getFunction ()
{
return tstVar
}