2017-10-12 10 views
1

J'essaie d'utiliser llvm pour mon projet. J'utilise des en-têtes de llvm et j'ai inclus leur chemin dans le Makefile. J'utilise également certaines bibliothèques llvm (.a), dont j'ai inclus les chemins et les noms dans le fichier makefile. Quand j'exécute le makefile, il construit le code source sans aucun avertissement ou erreur mais quand j'utilise le .so généré pour exécuter un plugin (pour mon projet), j'obtiens l'erreur pour un symbole indéfini:La source se construit sans erreurs/avertissements mais .so erreur "symbole non défini"

undefined symbole: _ZTIN4llvm2cl18GenericOptionValueE

où "_ZTIN4llvm2cl18GenericOptionValueE" est "LLVM :: cl :: GenericOptionValue"

Je construis LLVM suivant les commandes sur https://llvm.org/docs/GettingStarted.html

Cette erreur se produit indépendamment du fait que je le lien entre les bibliothèques llvm ou non. J'ai suivi les documents sur llvm.org mais je n'ai pas eu de succès. Plus précisément - http://releases.llvm.org/2.6/docs/Projects.html et http://releases.llvm.org/2.6/docs/MakefileGuide.html#overvars Le document sur le fichier Makefile LLVM guide mentionne Makefile.config et ce n'est pas présent. Est-ce que nayone a des suggestions?

Le makefile est:

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 
+0

Avez-vous vu [ce] (https://stackoverflow.com/questions/14140570/llvm-os-x-symbols-not-found- pour-architecture-x86-64-compile-erreur)? –

+0

Je ne sais pas si cela compte ici, mais notez que les documents que vous regardez sont très vieux (2.6 a été publié en 2009). Votre makefile dit que vous utilisez 3.8. –

+0

@StanislavPankevich Je viens de le voir .. Je ne suis pas sûr de savoir comment utiliser llvm-config. J'ai essayé de suivre les documents sur le site llvm.org mais j'ai encore des doutes. –

Répondre

0

Les gens disent [1] doit faire avec le drapeau -fno-rtti manquant entre les drapeaux transmis au compilateur (CXX_FLAGS).

Dans la question liée [2], l'auteur utilise llvm-config --cxxflags pour obtenir les bons indicateurs CXX recommandés par LLVM. Sur ma machine, la liste de ces drapeaux contient -fno-rtti et je crois que c'est ce que LLVM attend d'un compilateur à donner par défaut.

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

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

+0

J'ai essayé d'ajouter '-fno-rtt' mais pas de chance –

+0

Quel système d'exploitation et quelle version de LLVM utilisez-vous? Les miens sont Mac et LLVMs 3.9, 4.0 et 5.0. Ils ont tous 'bin/llvm-config' dans le même dossier où' clang' et 'clang ++' sont. Ou vous utilisez le compilateur Mac par défaut? –

+0

Linux avec Ubuntu 16.04 (64 bits). J'ai llvm-config dans // vm/build/bin/llvm-config. même dossier que clang et clang ++ –