1

環境は Microsoft Visual C++ 2015 と Windows 7 です。

inline extern "C"ヘッダーで定義された関数について何か特別なことはありますか? ヘッダーの 1 つにそのような獣が含まれている SDK を使用しています。私のアプリケーションには、前述のヘッダーを含めることだけが唯一の仕事である TU (翻訳単位) があります。それで全部です。他には何も入っていません。生成されたオブジェクト ファイルを掘り下げると、extern "C"関数が取り込まれていることがわかります。これにより、いくつかの望ましくない副作用が発生しています (主な問題から気をそらす可能性があるため、現時点では省略します)。

なぜこれが起こるのでしょうか?main()クライアント コードからは何も発生していません (エントリ ポイントとそのヘッダーを除いて、私の唯一の TU は空であることを思い出してください)。

私が遭遇していることをよりよく説明するかもしれない小さなスニペットで更新してください:

これが実際に起こっていることです:

FooObj.h

FooObj::FooObj() { }

FooObj::~FooObj() { CallIntoAnotherC_API(); }

SDKHeader.h

#include <FooObj.h>

extern "C" inline void SomeFunc(void* user_data)
{   
    A* obj = static_cast<A*>(user_data);
    obj->CallAnotherFunc(FooObj(33));
}

MyFile.cpp

#include "SDKHeader.h"

int main() { return 0; }

MyFile.cpp を実行可能ファイルにコンパイルすると、リンカーが CallIntoAnotherC_API が未解決の外部であると不平を言って失敗します。

4

1 に答える 1

0

ジョナサン・レフラー!私を正しい方向に向けてくれてありがとう。私は問題が何であるかを知り、控えめに言っても非常に奇妙です。上記の SDKHeader.h スニペットには、次のような SomeFunc の不要な宣言があります。

#include <FooObj.h>

// I don't know why this declaration exists but its presence is
// causing the compiler to include SomeFunc and everything it references
// in the object file causing eventual linker errors! Also notice that
// this declaration even misses the "inline" keyword.
extern "C" void SomeFunc(void* user_data);

extern "C" inline void SomeFunc(void* user_data)
{   
    A* obj = static_cast<A*>(user_data);
    obj->CallAnotherFunc(FooObj(33));
}

この余分な宣言を削除すると、リンカー エラーが取り除かれ、偽のシンボルがオブジェクト ファイルに表示されなくなります。

于 2016-05-29T20:07:54.907 に答える