【问题标题】:Source builds with no errors/warnings but .so error "undefined symbol"源构建没有错误/警告,但 .so 错误“未定义符号”
【发布时间】:2017-10-12 15:13:36
【问题描述】:

我正在尝试将 llvm 用于我的项目。我正在使用来自 llvm 的一些标头,并将它们的路径包含在 Makefile 中。我还使用了某些 llvm 库 (.a),它们的路径和名称已包含在 makefile 中。当我运行 makefile 时,它​​构建源代码时没有任何警告或错误,但是当我使用生成的 .so 运行插件(对于我的项目)时,我收到未定义符号的错误:

未定义符号:_ZTIN4llvm2cl18GenericOptionValueE

其中“_ZTIN4llvm2cl18GenericOptionValueE”是“llvm::cl::GenericOptionValue”

我按照https://llvm.org/docs/GettingStarted.html上的命令构建llvm

无论我是否链接 llvm 库,都会发生此错误。 我按照 llvm.org 上的文档进行操作,但没有取得任何成功。具体来说 - http://releases.llvm.org/2.6/docs/Projects.htmlhttp://releases.llvm.org/2.6/docs/MakefileGuide.html#overvars 关于 LLVM Makefile 指南的文档提到了 Makefile.config 并且不存在。有人有什么建议吗?

makefile 是:

CXXFLAGS=-I$(PVLIB_HOME)/include -I$(PVLIB_HOME)/include/fmruntime -I$(PVLIB_HOME)/include/fmruntime/eslapi \
         -I/work/Project1/trunk/work/fastsim/Plugins/include -I/work/llvm/llvm-3.8.0/include -I/work/llvm/build/include/ --std=c++11 -I. -fPIC -c

PLUGIN_SRCDIR=Plugin
PIPELINE_MODEL_SRCDIR=Microarchitecture
BUILD_DIR=build
PLUGIN_UTILS=Utils

LIB_PATH=-L/work/llvm/build/lib 
LIBS=-lLLVMSupport -lLLVMAArch64Desc -lLLVMAArch64Disassembler -lLLVMMCDisassembler -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMMC -lLLVMAArch64Utils -ldl


OBJECTS = $(BUILD_DIR)/CAInterface.o $(BUILD_DIR)/InOrderPipelineModelFactoryPlugin.o $(BUILD_DIR)/InOrderPipelineModelPluginHandler.o \
      $(BUILD_DIR)/InOrderPipelineModelPlugin.o $(BUILD_DIR)/InOrder4StagePipeline.o \
      $(BUILD_DIR)/AArch64Decoder.o $(BUILD_DIR)/EventHandler.o $(BUILD_DIR)/Decode.o $(BUILD_DIR)/ExecuteALU.o \
      $(BUILD_DIR)/ExecutionUnit.o $(BUILD_DIR)/Fetch.o $(BUILD_DIR)/Scoreboard.o \
      $(BUILD_DIR)/Scoreboard.o $(BUILD_DIR)/Write.o   

#
# Build the final plugin
#
$(BUILD_DIR)/InOrderPipelineModel.so: $(OBJECTS)
$(CXX) -shared -o $@ $^ $(LIB_PATH) $(LIBS)

#
# Build the plugin 
#
$(BUILD_DIR)/InOrderPipelineModelFactoryPlugin.o : $(PLUGIN_SRCDIR)/InOrderPipelineModelFactoryPlugin.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/InOrderPipelineModelPlugin.o : $(PLUGIN_SRCDIR)/InOrderPipelineModelPlugin.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/InOrderPipelineModelPluginHandler.o : $(PLUGIN_SRCDIR)/InOrderPipelineModelPluginHandler.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/CAInterface.o : $(PLUGIN_SRCDIR)/CAInterface.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

#
# Build the model
#
$(BUILD_DIR)/InOrder4StagePipeline.o : $(PIPELINE_MODEL_SRCDIR)/InOrder4StagePipeline.cpp 
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/AArch64Decoder.o : $(PIPELINE_MODEL_SRCDIR)/Utils/AArch64Decoder.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/EventHandler.o : $(PIPELINE_MODEL_SRCDIR)/EventHandler.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/Decode.o : $(PIPELINE_MODEL_SRCDIR)/Components/Decode.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/ExecuteALU.o : $(PIPELINE_MODEL_SRCDIR)/Components/ExecuteALU.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/ExecutionUnit.o : $(PIPELINE_MODEL_SRCDIR)/Components/ExecutionUnit.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/Fetch.o : $(PIPELINE_MODEL_SRCDIR)/Components/Fetch.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/Scoreboard.o : $(PIPELINE_MODEL_SRCDIR)/Components/Scoreboard.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 

$(BUILD_DIR)/Write.o : $(PIPELINE_MODEL_SRCDIR)/Components/Write.cpp
$(CXX) $(CXXFLAGS) $^ -o $@ 


.PHONY: clean

clean:
  @rm -rf $(BUILD_DIR)/*.o $(BUILD_DIR)/*.so

【问题讨论】:

  • 你看到this了吗?
  • 不确定这是否重要,但请注意您正在查看的文档非常旧(2.6 于 2009 年发布)。你的 makefile 说你使用的是 3.8。
  • @StanislavPankevich 刚看到.. 我不知道如何使用 llvm-config。我尝试关注 llvm.org 网站上的文档,但仍有疑问。
  • @IsmailBadawi 这些是唯一可用的官方文件

标签: makefile llvm


【解决方案1】:

人们说 [1] 这与传递给编译器 (CXX_FLAGS) 的标志中缺少标志 -fno-rtti 有关。

在链接的问题 [2] 中,作者使用llvm-config --cxxflags 来获取 LLVM 推荐的正确 CXX 标志。在我的机器上,这些标志的列表确实包含-fno-rtti,我相信这是 LLVM 期望编译器默认给出的。

[1][cmake] klee does not build without -fno-rtti #508

[2]LLVM OS X symbol(s) not found for architecture x86_64 compile error

【讨论】:

  • 尝试添加 '-fno-rtt' 但没有成功
  • 您使用的是哪个操作系统和哪个版本的 LLVM?我的是 Mac 和 LLVM 3.9、4.0 和 5.0。它们都在clangclang++ 所在的同一文件夹中拥有bin/llvm-config。或者您使用的是默认 Mac 的编译器?
  • Linux 与 Ubuntu 16.04(64 位)。我在 //vm/build/bin/llvm-config 中有 llvm-config。与 clang 和 clang++ 相同的文件夹
  • 所以重点是:您是否尝试从 llvm-config --cxxflags 复制所有或所有有意义的标志?我也会看看其他标志。 llvm-config --help 有很多选择。
  • 啊..我明白了..我试过那个 Stan,但无法摆脱未定义的符号。我还查看了其他可能丢失的标志
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多