【问题标题】:LLVM Error : External function could not be resolvedLLVM 错误:无法解析外部函数
【发布时间】:2014-10-21 08:49:02
【问题描述】:

我正在阅读 LLVM 的万花筒教程 (http://llvm.org/docs/tutorial/index.html)。

我想编译和测试语言。在一些编译器的错误(EngineBuilder 和 Module 的构造函数,链接库...)之后,示例程序被构建。然后,我尝试了语言。我在 InitializeNativeTargets、DataLayoutPass 方面遇到了一些问题……但我设法纠正了它们。

但是,我无法解决一个错误。当我写extern printd(x); printd(5); 时,程序不起作用:“LLVM 错误:程序使用了无法解析的外部函数'printd'”。

我在网上寻找解决方案。我阅读了很多网页,但没有任何效果。

我该如何解决这个问题?为什么 LLVM 找不到程序中包含的外部函数“printd”?提前感谢您的回答。

使用代码:https://docs.google.com/document/d/1Qb-zUGaUUIF354uFCXv1iuq8n_rjya6IHDW4WCPWN_4/edit?usp=sharing

.pro 文件(Qt Creator):

QT       += core
QT       -= gui
TARGET = Kaleidoscope
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += /home/alainetflo/Documents/me/C++/LLVM/llvm-3.5.0.src/include
DEPENDPATH += /home/alainetflo/Documents/me/C++/LLVM/llvm-3.5.0.src/include

LIBS += `llvm-config --ldflags --libs all --system-libs` -Wl,-no-as-needed

QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -rdynamic -std=c++11 -O3

我在 Ubuntu 14.04 32 位上使用 GCC 4.8.2、LLVM 3.5 和 Qt 5.3.1。

【问题讨论】:

  • 你在哪里写的?在同一个cpp文件中?为什么不直接调用函数?我想 extern 不需要
  • 我认为您应该通过提供一个更紧凑的示例来说明问题来澄清问题。在使用的代码中,我只能看到一个实现函数printd 的文件,但看不到它实际使用的位置。我可以建议您尝试的唯一事情是检查您是否还在要使用它的文件中将函数声明为extern "C",您的问题表明您仅声明为普通extern(没有@ 987654328@) 和名字 mangling 打动你。
  • 我将所有代码都写在同一个文件中:main.cpp。如果我不清楚,我很抱歉:我在程序执行期间在控制台中编写了“extern printd(x)[...]”(程序是解释器)。因此,需要 extern 否则程序会抛出语法错误。
  • 也许我明白了:您正在从控制台解析某些内容并尝试从 IR 的 printd 函数中进行 JIT,对吧?但是如何将函数体转换为 IR?我没有看到任何代码来做到这一点
  • 按照教程,确实是解析了控制台。感谢 LLVM 的 JIT,我可以运行代码。解释器中的“printd(5); 指令”应该调用 C++ 代码中的 printd 函数。指令“extern printd(5);”应该声明(并链接)该函数。清楚吗?

标签: c++ c++11 linker llvm llvm-ir


【解决方案1】:

最后,我在网上找到了一个很棒的链接:http://koichitamura.blogspot.fr/2011/01/since-i-went-to-held-several-weeks-ago.html

错误来自 .pro 文件中 -rdynamic 参数的错误位置(-rdynamic 必须在链接选项之后)。您需要这个参数,因为(GCC 手册页):

这指示链接器将所有符号添加到动态符号表中,而不仅仅是使用的符号。

我更改了 .pro 文件:

QT       += core    
QT       -= gui    
TARGET = Test01
CONFIG   += console
CONFIG   -= app_bundle    
TEMPLATE = app   
SOURCES += main.cpp    
INCLUDEPATH += /home/alainetflo/Documents/me/C++/LLVM/llvm-3.5.0.src/include
DEPENDPATH += /home/alainetflo/Documents/me/C++/LLVM/llvm-3.5.0.src/include
INCLUDEPATH += /usr/include/i386-linux-gnu/c++/4.8 \
/usr/include/c++/4.8

LIBS += `llvm-config --ldflags --libs all --system-libs` -Wl,-no-as-needed -rdynamic

QMAKE_CFLAGS += -m32

QMAKE_CXXFLAGS += -g -std=c++11 -O3

通过这种方式,程序可以正常运行! (本教程的示例运行 (http://llvm.org/docs/tutorial/LangImpl6.html#kicking-the-tires))

【讨论】:

  • 猜猜这一定是jit机制造成的;但我记得 1 年前我可以编译 w/o -rdynamic 链接标志
  • 无论如何,LLVM 3.5 和 GCC 4.8 都需要这个参数。你用什么编译的?或者,这是 jit 的机制吗?
  • 记不清了,当时还是llvm2.9和gcc4.4;抱歉,我对 jit 了解不多。
猜你喜欢
  • 1970-01-01
  • 2012-07-10
  • 2013-06-06
  • 1970-01-01
  • 2020-07-09
  • 2011-05-06
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多