对提供者进行了更清晰的编辑。很抱歉让大家感到困惑。
这是在 Windows 下。
我有一个使用 pimpl 习惯用法实现类的静态库。pimpl 标头不仅由消费代码使用,而且还链接到静态库。然而,当我编译消费代码 (.exe) 时,链接器会抱怨pimpl 标头应该隐藏的实现类上未解析的外部。
这怎么可能?
// Foo.lib
// Foo.h
class FooImpl;
class Foo
{
std::shared_ptr<FooImpl> pimpl_;
public:
Foo();
};
// Foo.cpp
#include "Foo.h"
#include "FooImpl.h"
Foo::Foo() : pimpl_(new FooImpl())
{
}
// This is how its used in Bar.exe
// Bar.exe links against Foo.lib
// Bar.h
#include "Foo.h"
class Bar
{
Foo access_foo_;
};
// Bar.cpp
#include "Bar.h"
当我编译/链接 Bar.exe 时,链接器抱怨它无法解析 FooImpl。我忘记了它到底说了什么,因为我现在无法访问我的工作电脑,但这就是它的要点。这个错误对我来说没有意义,因为走 pimpl 路线的目的是让 Bar.exe 不必担心 FooImpl。
确切的错误是这样的:
1>Foo.lib(Foo.obj) : error LNK2019: unresolved external symbol "public: __thiscall FooImpl::FooImpl(void)" (??0FooImpl@@QAE@XZ) 在函数 "public: __thiscall Foo::Foo (void)" (??0Foo@@QAE@XZ)