Makefile 源代码生成没有错误/警告,但是.so error“;“未定义符号”;

Makefile 源代码生成没有错误/警告,但是.so error“;“未定义符号”;,makefile,llvm,Makefile,Llvm,我正在尝试将llvm用于我的项目。我使用了llvm中的一些头文件,并在Makefile中包含了它们的路径。我还使用某些llvm库(.a),其路径和名称已包含在makefile中。当我运行makefile时,它生成的源代码没有任何警告或错误,但当我使用生成的代码时。因此,要运行插件(用于我的项目),我会得到未定义符号的错误: 未定义的符号:ztin4llvm2cl18通用选项值 其中“ZTIN4llvm2cl18GenericOptionValueE”是“llvm::cl::GenericOpti

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

未定义的符号:ztin4llvm2cl18通用选项值

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

我按照上面的命令构建llvm

无论是否链接llvm库,都会发生此错误。 我遵循了llvm.org上的文档,但没有取得任何成功。具体而言——以及 关于LLVM Makefile指南的文档中提到了Makefile.config,但这并不存在。没有人有什么建议吗

生成文件是:

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

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

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

[1]


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

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

[1]


[2]

您看到了吗?不确定这是否重要,但请注意,您正在查看的文档非常旧(2.6于2009年发布)。你的makefile说你正在使用3.8。@StanislavPankevich刚刚看到了。。我不知道如何使用llvm配置。我试图关注llvm.org网站上的文档,但仍有疑问。@IsmailBadawi您看到的是唯一可用的官方文档吗?不确定这是否重要,但请注意,您正在查看的文档非常旧(2.6于2009年发布)。你的makefile说你正在使用3.8。@StanislavPankevich刚刚看到了。。我不知道如何使用llvm配置。我试图关注llvm.org网站上的文档,但仍然有疑问。@IsmailBadawi这些是唯一可用的官方文档,添加了“-fno rtt”,但没有luckWhich操作系统,您使用的是哪个版本的llvm?我的是Mac和LLVMs 3.9、4.0和5.0。它们都在同一个文件夹中有
bin/llvm config
,其中包含
clang
clang++
。或者您正在使用默认的Mac编译器Linux和Ubuntu 16.04(64位)。我在//vm/build/bin/llvm-config中有llvm-config。与clang和clang++的文件夹相同,所以问题是:您是否尝试从
llvm config--cxfFlags
复制所有或所有有意义的标志?我也会看看其他的旗帜<代码>llvm配置--help有很多选项。啊。。我明白了。。我试过Stan,但无法摆脱未定义的符号。我还查看了其他可能丢失的标志,并尝试添加“-fno rtt”,但没有luckWhich操作系统,您使用的是哪个版本的LLVM?我的是Mac和LLVMs 3.9、4.0和5.0。它们都在同一个文件夹中有
bin/llvm config
,其中包含
clang
clang++
。或者您正在使用默认的Mac编译器Linux和Ubuntu 16.04(64位)。我在//vm/build/bin/llvm-config中有llvm-config。与clang和clang++的文件夹相同,所以问题是:您是否尝试从
llvm config--cxfFlags
复制所有或所有有意义的标志?我也会看看其他的旗帜<代码>llvm配置--help有很多选项。啊。。我明白了。。我试过Stan,但无法摆脱未定义的符号。我还查看了其他可能丢失的旗帜