1

私は最近、MinGW で LLVM の実験を始めました。Kaleidoscopeのチュートリアルを読みましたが、外部関数に問題があります。

次のような外部関数を宣言しています。

const Type* doubleType = Type::getPrimitiveType(ctx, Type::DoubleTyID);
std::vector<const Type*> doubleParams;
doubleParams.push_back(doubleType);
FunctionType* doubleDouble = FunctionType::get(doubleType, doubleParams, false);
Function* SinFunction = Function::Create(doubleDouble, Function::ExternalLinkage, "sin", mod);

mod は Module* で、ctx は LLVMContext& です。

この場合、すべてが正常に機能します。ただし、関数を宣言すると:

extern "C"
double my_cubic_transform(double x) {
    return x*x*x;
}

そして、SinFunction 宣言を "sin" の使用から "my_cubic_transform" の使用に (他には何も変更せずに) 変更すると、次のようになります。

LLVM ERROR: Program used external function 'my_cubic_transform' which could not be resolved

「-g」オプションを含めるようにメイクファイルを変更しても効果はありません。Kaleidoscope のチュートリアルでは、これが LLVM で可能であることが示唆されました (少なくとも、私が使用している JIT では)。それで、私は何か間違ったことをしていますか?もしそうなら、何?

4

1 に答える 1

5

気にしないで、私はそれを理解しました。

dll ではなく実行可能ファイル (exe) を使用しているにもかかわらず、my_cubic_transform を __declspec(dllexport) で宣言する必要があることがわかりました。

チュートリアルを書いた人は誰でも、__declspec が存在しない他のプラットフォームを使用したため、この問題を見つけられなかったに違いありません。

于 2010-07-03T19:07:31.760 に答える