【发布时间】:2021-05-26 18:17:27
【问题描述】:
我有一个链接到静态库并且都链接到共享库的应用程序。具体来说,应用是一个gtest,共享库是一个使用glog的类。
当我运行我的测试时,glog 会终止应用程序并打印“你调用了 InitGoogleLogging() 两次!”因为我做了...但它应该在库的两个不同副本上,具有两个不同的日志文件。
这是一个链接选项,将共享库放在一起还是分开?
【问题讨论】:
标签: c++ linker shared-libraries
我有一个链接到静态库并且都链接到共享库的应用程序。具体来说,应用是一个gtest,共享库是一个使用glog的类。
当我运行我的测试时,glog 会终止应用程序并打印“你调用了 InitGoogleLogging() 两次!”因为我做了...但它应该在库的两个不同副本上,具有两个不同的日志文件。
这是一个链接选项,将共享库放在一起还是分开?
【问题讨论】:
标签: c++ linker shared-libraries
按要求回答您的问题:有点,但不是真的。这是可能的,但它很复杂并且与动态库的运作方式背道而驰。
就解决您的问题而言:
google::InitGoogleLogging() 意味着从应用程序的main() 顶部调用。从一个类(可能是它的构造函数)中进行调用会带来很多麻烦。
将该调用移至main(),或记录图书馆要求其用户这样做的事实将删除重复的调用并总体上更清洁。
在紧要关头,您可以使用IsGoogleLoggingInitialized() 来摆脱困境,但我个人会尽可能避免依赖它,尤其是在库代码中。
【讨论】: