プロバイダーをもう少し明確に編集しました。皆様を混乱させて申し訳ありません。
これは 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 を解決できないと文句を言います。今は仕事用の PC にアクセスできないので、正確に何を言っているのか忘れてしまいましたが、それが要点です。pimpl ルートに進む目的は、Bar.exe が FooImpl を気にする必要がないようにすることだったので、このエラーは私には意味がありませんでした。
正確なエラーは次のようになります。
1>Foo.lib(Foo.obj): エラー LNK2019: 未解決の外部シンボル "public: __thiscall FooImpl::FooImpl(void)" (??0FooImpl@@QAE@XZ) が関数 "public: __thiscall Foo::Foo で参照されています(無効)" (??0Foo@@QAE@XZ)