【问题标题】:Using llvm::Function::dump(), linker gives "undefined reference to `llvm::Value::dump() const'"使用 llvm::Function::dump(),链接器给出“对 `llvm::Value::dump() const' 的未定义引用”
【发布时间】:2014-03-15 11:22:47
【问题描述】:

我正在尝试生成 LLVM IR 代码,我已经在同一台机器上使用这些相同的编译器标志成功地完成了该代码作为 Kaleidoscope tutorial 的一部分。

我的代码在 clang++ 3.4 中编译没有错误。但是,在链接时我得到:

undefined reference to `llvm::Value::dump() const'

错误是由该行触发的:

if (generator.code()) // returns llvm::Function*, or NULL
  generator.code()->dump();

如果我删除对dump() 的调用,链接器会很高兴。

我正在使用的 Clang++ 标志是:

-O3 -g -Wall -std=c++11 -I./src `llvm-config --cppflags --ldflags --libs core jit native`

我很困惑,因为 Kaleidoscope 项目编译和运行良好,并且使用相同的编译器标志并且构建在同一台计算机上。

【问题讨论】:

    标签: c++ clang llvm


    【解决方案1】:

    当与库链接时,必须将库放置在源/目标文件之后。

    所以你需要类似的东西

    clang++ -O3 -g -Wall -std=c++11 -I./src \
        `llvm-config --cppflags --ldflags core jit native` \
        objectfile1.o objectfile2.o \
        `llvm-config --libs core jit native` \
        -o outputfile
    

    这是因为链接器按照它们在命令行中给出的顺序查找符号。

    【讨论】:

    • 啊,那绝对不一样!我在另一个项目中手写构建脚本,并首先拥有我的源文件。在新项目中,它们就在CXXFLAGS 中,所以我的 Makefile 将源文件放在它们之后。我会稍微重组一下:)
    • 只需将$(CXXFLAGS)移动到源文件后即可解决问题,谢谢!一旦 SO 时间限制过去,将在几分钟内接受。
    • 我个人更喜欢将链接器命令拆分为$CXXFLAGS(或raterh $LDFLAG 用于链接器端)和$LIBS。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2023-04-02
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多