lui*_*bal 1 compiler-construction llvm extern
我最近开始在 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);
Run Code Online (Sandbox Code Playgroud)
其中 mod 是 Module*,ctx 是 LLVMContext&。
在这种情况下,一切正常。但是,如果我声明一个函数:
extern "C"
double my_cubic_transform(double x) {
return x*x*x;
}
Run Code Online (Sandbox Code Playgroud)
并将 SinFunction 声明从使用“sin”更改为使用“my_cubic_transform”(不更改任何其他内容),然后我得到:
LLVM ERROR: Program used external function 'my_cubic_transform' which could not be resolved
Run Code Online (Sandbox Code Playgroud)
更改我的 makefile 以包含“-g”选项无效。Kaleidoscope 教程建议这在 LLVM 中是可能的(至少对于我正在使用的 JIT)。所以我做错了什么吗?如果是这样,是什么?
没关系,我想通了。
事实证明,即使我使用的是可执行文件(exe)而不是 dll,我也必须使用 __declspec(dllexport) 声明 my_cubic_transform。
编写本教程的人一定使用过其他一些不存在 __declspec 的平台,因此没有发现此问题。