c++ - 主库和共享库之间的全局名称不可见

标签 c++ shared-libraries

我用 gcc 编译了一个共享库并将它链接到我的 main.主类应该初始化一个记录器类,它应该在共享库中可见,但看起来好像共享库有它自己的实例。

包含文件如下所示:

extern Log gLog;

主要声明它。

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);
}

我再次在链接器中得到一个 undefined symbol ,这次是我的 initLibrary 函数。

现在我通过创建一个有效的虚拟类来解决问题。但是,我想知道如何跨共享库边界正确定义符号,因为我的理解似乎是错误的。

使用谷歌时,我在这里发现了一些话题 Using a global variable in a shared libraryGlobal variables, shared libraries and -fPIC effect作为例子(这个问题还有其他几个)。然而,我尝试用 -fpic 重新编译所有内容,还有主模块,但它仍然不起作用。 -rdynamic 选项是未知的,所以我不知道这是从哪里来的。

我可以使用共享库中的类,反之亦然,因此这只会影响全局符号。那么我做错了什么主代码和共享库看不到彼此的符号?

最佳答案

正确的方法是在共享库内部创建记录器的实例,使用全局变量(如果封装在命名空间中更好)或单例类。然后让你的主程序使用它。

关于c++ - 主库和共享库之间的全局名称不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16729026/

相关文章:

Windows10 上的 Python 3.5 - 无法安装 cx_freeze - 'cxfreeze-postinstall' 不存在

c++ - QVector、QList 等。为什么索引是 int 而不是 size_t

android - native Android-加载共享库时,即使先前加载的共享库包含定义,也无法找到未定义的方法

从 C 调用的 C++ 共享库

c++ - 将共享库与 dlopen 一起使用 - 共享对象找不到加载程序导出的符号

xamarin - 在 VS 2017 中在哪里设置 RemoteRootDirectory 来编译 iOS C++ 共享库

C++ DX11 应用程序仅在 Visual Studio IDE 中运行

c++ - 如何在 Qt 中将按钮作为信号并将表格作为插槽?

c++ - 使用基于动态/状态的分配器的 STL 实现?

java - 从 JAR 文件外部加载资源文件