我正在尝试卤化物,并希望在此基础上构建一个小型共享库。但是,Halide的AOT编译生成的代码似乎并不是独立于位置的。如何将Halide生成的对象链接到我的共享库中?
Update从我的代码中提取了一个小示例。
特别地,我在c++中使用了一个生成器:
class SimpleAddition : public Halide::Generator<SimpleAddition> {
public:
SimpleAddition() : vars(4) {}
Input<Halide::Buffer<>> lhs{"lhs"};
Input<Halide::Buffer<>> rhs{"rhs"};
Output<Halide::Buffer<>> out{"out"};
std::vector<Var> vars;
void generate() {
out(vars) = lhs(vars) + rhs(vars);
}
};
HALIDE_REGISTER_GENERATOR(SimpleAddition, simple_addition)与来自CMake的助手:
halide_library(ops SRCS ${CMAKE_CURRENT_LIST_DIR}/src/simple_addition.cc
GENERATOR_NAME simple_addition
GENERATOR_ARGS lhs.type=float32 lhs.dim=4 rhs.type=float32 rhs.dim=4 out.type=float32)并得到以下错误:
/usr/bin/ld: ./genfiles/halide_rt_host/halide_rt_host.a(halide_rt_host.a.o): relocation R_X86_64_PC32 against symbol `_ZN6Halide7Runtime8Internal13custom_mallocE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status我还尝试通过使用CMake自己运行生成器(不使用-e o,h包装器)来生成对象,并以类似的方式运行llvm,后面跟着llc -relocation-model=pic,以及Func::compile_to_object。当我试图将生成的对象链接回共享库时,也发生了类似的错误:
/usr/bin/ld: halide_runtime_x86.o: relocation R_X86_64_PC32 against symbol `_ZN6Halide7Runtime8Internal13custom_mallocE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status我在Ubuntu 18.10上运行这个。Halide和我的代码都是用gcc-8.2.0编译的。LLVM/Clang-7是在它们的存储库中提供的。卤化物是用简单的cmake ../ && make && make install构建的。
对于测试代码的编译器标志,CMake中使用的命令是add_libarary(mylib SHARED ...)。非CMake有像-fPIC -shared这样的标志,没有什么特别的,因为我还在学习。
发布于 2019-03-19 16:41:11
默认情况下,卤化物应该生成PIC (参见Codegen_Internal.cpp,make_target_machine())。你的目标是什么架构?你在使用什么编译器/链接器,有什么选项,等等?
https://stackoverflow.com/questions/55234614
复制相似问题