是否可以在应用程序中定义全局变量,由已加载dlopen()的共享库访问?
我将它声明为extern但是当应用程序加载并尝试使用它时,我得到一个未定义的符号错误。
我正在使用设置为RTLD_LAZY |的标志加载库RTLD_GLOBAL。
答案 0 :(得分:1)
您需要构建一个应用程序,其中包含-rdynamic
g++
选项的全局变量。此选项指示链接器(ld
)将所有符号(不仅是已使用的符号)添加到应用程序的动态符号表中。
这是我如何构建加载共享库的测试C ++应用程序的示例。共享库使用main.cpp
中的全局变量。所以我在构建我的-rdynamic
应用程序时添加了main
:
g++ -rdynamic -m64 -g main.cpp -o main -ldl
当g++
找到-rdynamic
时,它会将标记-export-dynamic
传递给ELF链接器(ld
)。
这来自man ld
(实际上创建了动态符号表):
如果您使用" dlopen"加载需要引用的动态对象 到程序定义的符号,而不是其他一些动态 对象,然后您可能需要在链接时使用此选项 程序本身。
有用的链接: