Hi.
I’m trying to compile reduced clang “driver.cpp” - added printf for arguments - and i’m getting linking with libLLVMSupport.a error - no StringSaver class found.
lib
echo “compiling cmd builder (x86_64) …”
clang++ ../llvm_34_local_installed2/bin/llvm-config --cxxflags
-I …/llvm_34/tools/clang/include -I …/llvm_34_build_local2/tools/clang/include -c ./lib_cmd_builder.cpp -o ./lib_cmd_builder_x86_64.o
echo “linking cmd builder (x86_64) …”
CMD=“clang++ ../llvm_34_local_installed2/bin/llvm-config --ldflags
./lib_cmd_builder_x86_64.o -o exe_cmd_builder_x86_64 ../llvm_34_local_installed2/bin/llvm-config --libs
-lclangARCMigrate -lclangAST -lclangASTMatchers -lclangAnalysis -lclangApplyReplacements -lclangBasic -lclangCodeGen -lclangDriver -lclangDynamicASTMatchers -lclangEdit -lclangFormat -lclangFrontend -lclangFrontendTool -lclangIndex -lclangLex -lclangParse -lclangQuery -lclangRewriteCore -lclangRewriteFrontend -lclangSema -lclangSerialization -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangStaticAnalyzerFrontend -lclangTidy -lclangTidyGoogleModule -lclangTidyLLVMModule”
Error message:
Undefined symbols for architecture x86_64:
“typeinfo for llvm::StringSaver”, referenced from:
typeinfo for (anonymous namespace)::StringSetSaver in lib_cmd_builder_x86_64.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Checking libLLVM is found and contains CommandLine object data:
(found on -L path):
find …/llvm_34_local_installed2/lib/ -name “upport”
…/llvm_34_local_installed2/lib//libLLVMSupport.a
(contains CommandLine.cpp object data):
ar -t …/llvm_34_local_installed2/lib//libLLVMSupport.a | grep CommandLine
CommandLine.cpp.o
The class StringSaver is declared in CommandLine.cpp:
/Users/asmirnov/Documents/dev/src/llvm_34/include/llvm/Support/CommandLine.h
class StringSaver {
virtual void anchor();
public:
virtual const char *SaveString(const char *Str) = 0;
virtual ~StringSaver() {}; // Pacify -Wnon-virtual-dtor.
};
StringSaver inheritor is declared and implemented in self file (lib_cmd_builder.cpp):
namespace {
class StringSetSaver : public llvm::StringSaver {
public:
StringSetSaver(std::setstd::string &Storage) : Storage(Storage) {}
const char *SaveString(const char *Str) LLVM_OVERRIDE {
return SaveStringInSet(Storage, Str);
}
private:
std::setstd::string &Storage;
};
}
So i can’t understand why i’m having this error.
Any thoughts?