在C ++中,可以从dynamic库中访问一个外部定义的全局variables吗?

在C ++中,可以从dynamic库中访问外部定义的全局variables吗?

我有一个全局variables在头文件中声明如下;

文件名:TestVariable.hpp

#ifndef TESTVARIABLE_HPP #define TESTVARIABLE_HPP extern int testVariable; #endif 

然后在源代码文件中定义如下:

文件名:TestVariable.cpp

 int testVariable; 

构成我的dynamic库的源代码如下:

文件名:Plugin.cpp

 #include <TestVariable.hpp> #ifdef __cplusplus extern "C" { #endif void * __attribute__((constructor)) loadLibrary ( void ) { testVariable = 100; } void * __attribute__((destructor)) unloadLibrary ( void ) { } #ifdef __cplusplus } #endif 

我的主要function定义如下:

文件名:main.cpp

 #include <iostream> #include <dlfcn.h> // dlopen #include <TestVariable.hpp> using std::cout; using std::endl; int main(void) { void * libHandle_p = NULL; cout << "Test variable = " << testVariable << endl; // Load the dynamic library. libHandle_p = dlopen("./.libs/libPlugin.so", RTLD_LAZY); if (libHandle_p == NULL) { cout << "Error loading library" << endl; return(-1); } cout << "Test variable = " << testVariable << endl; return(0); } 

我可以使用GNU Autotools,g ++和ld正确编译和链接所有的代码(并且没有任何警告),但是当我运行生成的二进制可执行文件时,它不能删除dynamic库文件。 但是,如果我注释掉构成函数loadLibrary主体的唯一一行代码,然后重新编译和链接,程序就能正常工作!

如果我不知道更好,我会说,当dlopen被调用(库)时,库无法parsing其对全局variablestestVariable的引用,这是导致dlopen操作失败的原因。 可能的联系types和/或名称混搭与这个问题有关吗?

如果我在生成的dynamic库上运行Linux nm实用程序,它会告诉我,符号testVariable是未定义的,即“U”。 如果我在二进制可执行文件上运行nm实用程序,它会告诉我符号testVariable存在并驻留在未初始化的数据部分(即“B”)中。 那么为什么不能在加载dynamic库时parsing这个符号呢?

我只从源文件Plugin.cpp生成dynamic库。 二进制可执行文件是由两个源代码文件main.cppTestVariable.cpp生成的

有人可以请帮忙。 我可以发誓,答案是盯着我的脸,但我只是没有看到它。

提前致谢。

看来我已经解决了我自己的问题。 在编译二进制可执行文件(而不是动态库)时将以下参数传递给GNU g ++编译器修复了这个问题;

 -Wl,--export-dynamic 

因为它强制链接器将符号testVariable添加到动态符号表,并根据ld(GNU链接器)的手册页,动态符号表包含动态对象可见的符号集(我的库在这种情况下)在运行时。

抱歉给你带来不便。