【发布时间】:2013-05-19 16:54:00
【问题描述】:
我用 gcc 编译了一个共享库并将其链接到我的主库。主类应该初始化一个记录器类,它应该在共享库中可见,但看起来好像共享库有它自己的实例。
包含文件如下所示:
extern Log gLog;
在 main 中声明它。
Log gLog(new StreamWriter());
当我尝试链接它时,我在共享库中收到链接器错误undefined symbol _gLog。我以为可能是因为它是一个类实例,所以我把它改成了一个指针,但我得到了同样的结果。更糟的是,我想我可以创建一个小的虚拟模块,在共享库中创建相同的全局变量,然后调用一个函数来初始化它。但是对于这个函数,我也会得到一个链接器错误,因为它在 main 中不可见。
在共享库中:
Log *gLogger;
int initLibrary(Log *pLogger)
{
gLogger = pLogger;
}
主要是:
Log gLog(new StreamWriter());
int initLibrary(Log *pLogger);
main()
{
initLibrary(&gLog);
}
我再次在链接器中得到一个未定义的符号,这次是我的 initLibrary 函数。
现在我通过创建一个有效的虚拟类来解决问题。但是,我想知道如何正确定义跨共享库边界的符号,因为我的理解似乎是错误的。
使用 google 时,我在这里找到了一些线程 Using a global variable in a shared library 和 Global variables, shared libraries and -fPIC effect 作为示例(还有其他几个与此问题有关的问题)。但是我尝试使用 -fpic 重新编译所有内容,这也是主模块,但它仍然无法正常工作。 -rdynamic 选项未知,所以我不知道它来自哪里。
我可以使用共享库中的类,反之亦然,所以这只影响全局符号。那我做错了什么,主代码和共享库看不到彼此的符号?
【问题讨论】:
-
我想这与 C++ 的名称修饰机制有关。
标签: c++ shared-libraries