我正在尝试编译使用另一个共享库(B)的共享库(A)。
必须在不向g ++添加-std=c++11
选项的情况下编译A库(因为有大量代码,而std::make_pair
等某些内容不适用于 11标准)。
对于使用B库,第一个只在其中一个文件中#include "B.h"
,然后使用-I/path/inc -L/path/lib -lB
进行编译。
库B由namespace B
内的一组函数构成,并在其自己的命名空间(B :: internals)中包含一些类定义。函数和类之间的关系是全局范围内的静态指针,用__attribute__((constructor))
初始化。
问题是这个类(B :: internals :: classB)定义了一些std::mutex
私有属性,并且遵循include链:
libA - > libB - > B::internals
- > std::mutex
,
在没有-std=c++11
标准编译的情况下编译libA时失败。
但是,libA从不使用B::internals
,因此混合两个库不应该是一个问题。此外,如果c ++ 11功能是私有属性,为什么它们不会隐藏到libA?是否有一些模式隐藏B::internals
到libA?
答案 0 :(得分:1)
有一个C ++习惯用法隐藏了名为Pimpl
的实现细节。
此外,使用不同C ++选项编译的库不得在其接口中公开任何std
容器,因为它们的布局在不同的C ++版本中是不同的。