源生成没有错误/警告,但.so错误“未定义符号”
我想为我的项目使用llvm。我使用了一些来自llvm的头文件,并在Makefile中包含了它们的路径。我也在使用某些llvm库(.a),它们的路径和名称已经包含在makefile中。当我运行生成文件时,它会生成没有任何警告或错误的源代码,但是当我使用生成的.so运行插件(对于我的项目)时,出现未定义符号的错误:源生成没有错误/警告,但.so错误“未定义符号”
未定义符号:_ZTIN4llvm2cl18GenericOptionValueE
其中 “_ZTIN4llvm2cl18GenericOptionValueE” 是 “LLVM :: CL :: GenericOptionValue”
我建立LLVM上https://llvm.org/docs/GettingStarted.html
以下的命令而不论是否我链接的LLVM库或不发生该错误。 我跟着llvm.org上的文件,但没有取得任何成功。具体来说 - http://releases.llvm.org/2.6/docs/Projects.html和http://releases.llvm.org/2.6/docs/MakefileGuide.html#overvars 有关LLVM Makefile指南的文档中提到了Makefile.config,但这不存在。 nayone有什么建议吗?
生成文件是:
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 [email protected] $^ $(LIB_PATH) $(LIBS)
#
# Build the plugin
#
$(BUILD_DIR)/InOrderPipelineModelFactoryPlugin.o : $(PLUGIN_SRCDIR)/InOrderPipelineModelFactoryPlugin.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/InOrderPipelineModelPlugin.o : $(PLUGIN_SRCDIR)/InOrderPipelineModelPlugin.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/InOrderPipelineModelPluginHandler.o : $(PLUGIN_SRCDIR)/InOrderPipelineModelPluginHandler.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/CAInterface.o : $(PLUGIN_SRCDIR)/CAInterface.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
#
# Build the model
#
$(BUILD_DIR)/InOrder4StagePipeline.o : $(PIPELINE_MODEL_SRCDIR)/InOrder4StagePipeline.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/AArch64Decoder.o : $(PIPELINE_MODEL_SRCDIR)/Utils/AArch64Decoder.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/EventHandler.o : $(PIPELINE_MODEL_SRCDIR)/EventHandler.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/Decode.o : $(PIPELINE_MODEL_SRCDIR)/Components/Decode.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/ExecuteALU.o : $(PIPELINE_MODEL_SRCDIR)/Components/ExecuteALU.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/ExecutionUnit.o : $(PIPELINE_MODEL_SRCDIR)/Components/ExecutionUnit.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/Fetch.o : $(PIPELINE_MODEL_SRCDIR)/Components/Fetch.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/Scoreboard.o : $(PIPELINE_MODEL_SRCDIR)/Components/Scoreboard.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
$(BUILD_DIR)/Write.o : $(PIPELINE_MODEL_SRCDIR)/Components/Write.cpp
$(CXX) $(CXXFLAGS) $^ -o [email protected]
.PHONY: clean
clean:
@rm -rf $(BUILD_DIR)/*.o $(BUILD_DIR)/*.so
人们说[1]这与标志-fno-rtti
丢失传递到编译器标志(CXX_FLAGS)之中的事情。
在链接问题[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。他们在'clang'和'clang ++'所在的文件夹中都有'bin/llvm-config'。或者你正在使用默认的Mac编译器? –
Linux与Ubuntu 16.04(64位)。我在// vm/build/bin/llvm-config中配置了llvm-config。与clang和铛相同的文件夹++ –
你看到[这](https://stackoverflow.com/questions/14140570/llvm-os-x-symbols-not-found-换架构的x86-64编译错误)? –
不确定这里是否重要,但请注意您正在查看的文档非常陈旧(2.6版在2009年发布)。你的makefile说你在用3.8。 –
@StanislavPankevich刚看到它..我不知道如何使用llvm-config。我试图遵循llvm.org网站上的文档,但仍有疑问。 –