【发布时间】:2016-04-11 00:31:24
【问题描述】:
我正在尝试使用两个源文件创建 LLVM Pass,但是当我编译时,cmake 对我大喊:
[1/1] Linking CXX shared module lib/LLVMHydrogen.so
FAILED: : && /usr/bin/c++ -fPIC -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -std=c++11 -fPIC -g -shared -Wl,-soname,LLVMHydrogen.so -o lib/LLVMHydrogen.so lib/Transforms/Hydrogen/CMakeFiles/LLVMHydrogen.dir/Hydrogen.cpp.o lib/Transforms/Hydrogen/CMakeFiles/LLVMHydrogen.dir/conditional_blocks.cpp.o -Wl,-rpath,"\$ORIGIN/../lib" && :
/usr/bin/ld: lib/Transforms/Hydrogen/CMakeFiles/LLVMHydrogen.dir/conditional_blocks.cpp.o: relocation R_X86_64_PC32 against undefined symbol `_ZTVN12_GLOBAL__N_18HydrogenE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
重点是:
针对未定义符号重定位 R_X86_64_PC32 制作共享时不能使用`_ZTVN12_GLOBAL__N_18HydrogenE' 目的;用 -fPIC 重新编译
我尝试将 -fPIC 添加到我的编译标志(和链接标志以获得良好的衡量标准),但没有任何帮助。这是我的 CMakeLists.txt:
SET(COMPILE_FLAGS "-fPIC")
SET(LINK_FLAGS "-lPIC")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_FLAGS}" )
add_llvm_loadable_module( LLVMHydrogen
Hydrogen.cpp
conditional_blocks.cpp
DEPENDS
intrinsics_gen
)
但我得到相同的输出。我究竟做错了什么?我觉得使用多个源文件应该非常简单:/
谢谢
源代码:
氢.h:
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
using namespace std;
using namespace llvm;
namespace {
struct Hydrogen : public FunctionPass {
static char ID; // Pass identification, replacement for typeid
Hydrogen() : FunctionPass(ID) {}
bool runOnFunction(Function &f) override;
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
}
};
}
static const char h_name[] = "Hydrogen pass";
char Hydrogen::ID = 0;
static RegisterPass<Hydrogen> X("Hydrogen", "Hydrogen Pass");
hydrogen.cpp:(第一个“主”文件)
#include "hydrogen.h"
bool Hydrogen::runOnFunction(Function &fun)
{
return true;
}
conditional_blocks.cpp:(第二个文件)
#include "hydrogen.h"
【问题讨论】:
-
这不是 CMake 的抱怨,而是链接器。你的代码是什么样的? Demangling这个符号,好像是缺少vtable:
vtable for (anonymous namespace)::Hydrogen -
目前除了包含头文件外,第二个文件(conditional_blocks.cpp)中没有实际代码。第一个文件只有一个基本的函数传递。没什么特别的。
-
我写的是“展示”,而不是“简要描述”,所以我们不需要猜测。对于它的价值,您可能是 don't have a body on a virtual destructor 类
Hydrogen。如果没有实际看到代码,很难分辨。 -
我更新了帖子以包含所有相关文件(减少了一点)。另外,如果这有什么不同的话,我正在和 Ninja 一起建造。
-
@tdwyer:在 Stack Overflow 上,我们不在问题的标题或正文中使用 SOLVED 标记。相反,创建一个 answer 帖子并在那里描述解决方案。然后你可以accept你的答案,这自动意味着你解决了问题。请注意,在任何情况下,问题都应包含原始代码(有问题)。