C++ LLVM-5.0生成文件未定义引用失败

C++ LLVM-5.0生成文件未定义引用失败,c++,makefile,llvm,C++,Makefile,Llvm,在我的代码中包含以下语句 main_模块->转储();//主模块的类型为llvm::module* 导致以下链接器错误: 对“llvm::Module::dump()const”的未定义引用 转储方法位于/usr/lib/llvm-5.0/include/llvm/IR/Module.h 我检查了stack overflow(),当链接器没有按正确的顺序向库中提供信息时,我们似乎遇到了这个错误。但是,在我的编译命令中,我显然最终拥有了这些库: clang++-5.0-g-O3 main.cpp

在我的代码中包含以下语句

main_模块->转储();//主模块的类型为llvm::module*


导致以下链接器错误:

对“llvm::Module::dump()const”的未定义引用

转储方法位于
/usr/lib/llvm-5.0/include/llvm/IR/Module.h

我检查了stack overflow(),当链接器没有按正确的顺序向库中提供信息时,我们似乎遇到了这个错误。但是,在我的编译命令中,我显然最终拥有了这些库:

clang++-5.0-g-O3 main.cpp-o main llvm-config-5.0--cxflags--ldflags--system libs--libs core mcjit native

感谢您的帮助

奇怪的是,链接器发现dump方法的类型。很明显,它在包含文件中。那么为什么它会称之为未定义的引用呢

我正在尝试运行的代码: `

#包括“llvm/IR/LLVMContext.h”
#包括“llvm/IR/Module.h”
#包括“llvm/IR/IRBuilder.h”
#包括
使用名称空间llvm;
静态LLVMContext-ctxt;
静态IRBuilder(ctxt);
int main(int argc,字符**argv){
模块*主模块=新模块(“主模块”,ctxt);
std::cout getModuleIdentifier()getFunction(“main”)){
std::cout dump();//由于使用LLVM进行调试和测试的原因,需要使用此选项
返回0;
}

似乎
转储的定义在
ASMWriter.cpp
中,似乎已被删除。 另外,
ASMWrite.cpp
的调试方法引用了
debug.cpp
中的
dbgs()


我通过复制
debug.cpp
Module::dump()
(来自ASMWriter.cpp--因为我不需要整个代码,所以只需要此文件中的一个特定子例程)修复了这个问题例程并将其放入我的cpp文件中。

除了提供的解决方案外,您还可以调整代码以避免调用
dump
。您可以通过调用:

main_module->print(llvm::outs(), nullptr);
类似地,如果要转储LLVM函数,可以编写:

main_func->print(llvm::outs());

实际上,从LLVM 5.0.0开始,这就是
dump()
函数的实现方式。

不应该将“LLVM-config-5.0--cxflags--ldflags--system libs--libs”放在反引号中,例如“`LLVM-config-5.0--cxflags--ldflags--system libs--libs`”?链接器与头文件无关。编译器与头文件无关,它将您使用的函数和方法的名称输出到目标文件中,以便链接器可以链接它们,或者在无法链接时告诉您哪些函数和方法未定义。目标文件包含对
llvm::Module::dump()的调用const
。这是链接器知道的。因此链接器需要该方法的定义来完成该调用,但却找不到。@G.M.应该是反引号,只是它`也代表堆栈溢出中的代码块,\并不是真正起到转义键的作用。@MikeKinghan您想将您的注释转换为答案,这样我才能做出解释吗这是公认的答案吗?这只是对你的信息的评论。这不是答案,因为它不能解释你的链接失败或如何修复它。
main_func->print(llvm::outs());