[LLVMdev] Troubles with clang and llvm libraries and simple Xcode project

Graham Wakefield lists at grahamwakefield.net
Thu Dec 18 14:19:16 PST 2008


Hi,

I'm having a hard time linking the LLVM/clang libraries in Xcode.  
I've been fighting this for a couple of days now, and decided to make  
a fresh checkout and a super-simple demo project to try and isolate  
the problem, but even so I'm getting undefined symbol errors in the  
linker for the static libraries LLVM is producing. This is really  
baffling, so probably I'm missing something super-basic, but here's  
what I did:



svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
...
Checked out revision 61210.
cd llvm
cd tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
...
Checked out revision 61210.

edit Makefile
... modified to add clang to the list of PARALLEL_DIRS ...

cd ..
... I'm configuring with PIC because I'll need to use clang/LLVM  
within a library that will be dynamically loaded:
./configure -enable-pic -enable-optimized
... everything fine except:
checking whether llvm-gcc is sane... dyld: Library not loaded: /usr/ 
lib/libiconv.2.dylib
   Referenced from: /usr/local/bin/llvm-gcc
   Reason: Incompatible library version: llvm-gcc requires version  
7.0.0 or later, but libiconv.2.dylib provides version 5.0.0
no

make -k
... mostly fine, I guess these are harmless?:
/code/llvm/lib/AsmParser/llvmAsmParser.y contains 6 shift/reduce  
conflicts and 136 reduce/reduce conflicts.
..
llvm[2]: Compiling llvmAsmParser.cpp for Release build
/usr/share/bison.simple: In function 'int llvmAsmparse()':
/usr/share/bison.simple:614: warning: comparison between signed and  
unsigned integer expressions
/usr/share/bison.simple:626: warning: comparison between signed and  
unsigned integer expressions
...
llvm[4]: Compiling DeclSerialization.cpp for Release build
DeclSerialization.cpp: In static member function 'static  
clang::FunctionDecl* clang::FunctionDecl::CreateImpl 
(llvm::Deserializer&, clang::ASTContext&)':
DeclSerialization.cpp:521: warning: 'numParams' may be used  
uninitialized in this function
..
llvm[2]: Linking Release Shared Library LTO.dylib
*** Warning: Linking the shared library /code/llvm/Release/lib/ 
libLTO.la against the non-libtool
*** objects  /code/llvm/Release/lib/LLVMCppBackend.o /code/llvm/ 
Release/lib/LLVMMSIL.o /code/llvm/Release/lib/LLVMCBackend.o /code/ 
llvm/Release/lib/LLVMXCore.o /code/llvm/Release/lib/LLVMPIC16.o /code/ 
llvm/Release/lib/LLVMCellSPUCodeGen.o /code/llvm/Release/lib/ 
LLVMCellSPUAsmPrinter.o /code/llvm/Release/lib/LLVMMips.o /code/llvm/ 
Release/lib/LLVMARMAsmPrinter.o /code/llvm/Release/lib/ 
LLVMARMCodeGen.o /code/llvm/Release/lib/LLVMIA64.o /code/llvm/Release/ 
lib/LLVMAlphaCodeGen.o /code/llvm/Release/lib/LLVMAlphaAsmPrinter.o / 
code/llvm/Release/lib/LLVMPowerPCAsmPrinter.o /code/llvm/Release/lib/ 
LLVMPowerPCCodeGen.o /code/llvm/Release/lib/LLVMSparcCodeGen.o /code/ 
llvm/Release/lib/LLVMSparcAsmPrinter.o /code/llvm/Release/lib/ 
LLVMX86AsmPrinter.o /code/llvm/Release/lib/LLVMX86CodeGen.o is not  
portable!

make install
...
llvm[3]: Installing Release Shared Library /usr/local/lib/ 
libLLVMHello.dylib
mklib: install: warning: remember to run `mklib --finish /code/llvm/ 
Release/lib'
...



And that's it. Then I make a simple command-line tool in Xcode,  
linking to the libraries in /usr/local/lib. Here's what xcode emits:



Building target “weirdbug_nolib” of project “llvmAV” with  
configuration “Release”
Checking Dependencies
CompileC build/llvmAV.build/Release/weirdbug_nolib.build/Objects- 
normal/i386/main_weird.o /code/luaAV/oct08/mergathon/llvmAV/ 
main_weird.cpp normal i386 c++ com.apple.compilers.gcc.4_0
     cd /code/luaAV/oct08/mergathon/llvmAV
     /Developer/usr/bin/gcc-4.0 -x c++ -arch i386 -pipe -Wno- 
trigraphs -fpascal-strings -Os -fmessage-length=0 -fvisibility- 
inlines-hidden -mmacosx-version-min=10.4 -I/code/luaAV/oct08/ 
mergathon/llvmAV/build/llvmAV.build/Release/weirdbug_nolib.build/ 
weirdbug_nolib.hmap -Wmost -Wno-four-char-constants -Wno-unknown- 
pragmas -F/code/luaAV/oct08/mergathon/llvmAV/build/Release -I/code/ 
luaAV/oct08/mergathon/llvmAV/build/Release/include -I/usr/local/ 
include -I/code/luaAV/oct08/mergathon/llvmAV/build/llvmAV.build/ 
Release/weirdbug_nolib.build/DerivedSources -D__STDC_CONSTANT_MACROS - 
D__STDC_LIMIT_MACROS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -c / 
code/luaAV/oct08/mergathon/llvmAV/main_weird.cpp -o /code/luaAV/oct08/ 
mergathon/llvmAV/build/llvmAV.build/Release/weirdbug_nolib.build/ 
Objects-normal/i386/main_weird.o

Ld /code/luaAV/oct08/mergathon/llvmAV/build/Release/weirdbug_nolib  
normal i386
     mkdir /code/luaAV/oct08/mergathon/llvmAV/build/Release
     cd /code/luaAV/oct08/mergathon/llvmAV
     /Developer/usr/bin/g++-4.0 -o /code/luaAV/oct08/mergathon/llvmAV/ 
build/Release/weirdbug_nolib -L/code/luaAV/oct08/mergathon/llvmAV/ 
build/Release -L/usr/local/lib -F/code/luaAV/oct08/mergathon/llvmAV/ 
build/Release -filelist /code/luaAV/oct08/mergathon/llvmAV/build/ 
llvmAV.build/Release/weirdbug_nolib.build/Objects-normal/i386/ 
weirdbug_nolib.LinkFileList -lclangAnalysis -lclangAST -lclangBasic - 
lclangCodeGen -lclangDriver -lclangLex -lclangParse -lclangRewrite - 
lclangSema -lLLVMAnalysis -lLLVMArchive -lLLVMAsmParser - 
lLLVMAsmPrinter -lLLVMBitReader -lLLVMBitWriter -lLLVMCodeGen - 
lLLVMCore -lLLVMDebugger -lLLVMInstrumentation -lLLVMipa -lLLVMipo - 
lLLVMLinker -lLLVMScalarOpts -lLLVMSelectionDAG -lLLVMSupport - 
lLLVMSystem -lLLVMTarget -lLLVMTransformUtils -arch i386 -Wl,-Y,1455 - 
mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk

At this point, I get hundreds of undefined symbols from both clang  
and LLVM. Seems like the libraries are not built correctly, but I  
can't see anything wrong with the steps I took above.
I've included a selection of the linker errors below.

/Developer/usr/bin/../libexec/gcc/i686-apple-darwin8/4.0.1/ld:  
Undefined symbols:
clang::ASTConsumer::InitializeTU(clang::TranslationUnit&)
clang::ASTConsumer::~ASTConsumer()
...
vtable for clang::DeclRefExpr
vtable for clang::BinaryOperator
...
typeinfo for llvm::AliasAnalysis
llvm::ConstantFoldCall(llvm::Function*, llvm::Constant* const*,  
unsigned int)
llvm::ConstantFoldInstruction(llvm::Instruction*, llvm::TargetData  
const*)
llvm::ConstantFoldLoadThroughGEPConstantExpr(llvm::Constant*,  
llvm::ConstantExpr*)
llvm::CallGraphLinkVar
llvm::CallGraphSCCPass::assignPassManager(llvm::PMStack&,  
llvm::PassManagerType)
vtable for llvm::CallGraphSCCPass
...
and so on, then:
...
/usr/local/lib/libclangCodeGen.a(ModuleBuilder.o) reference to  
undefined clang::ASTConsumer::InitializeTU(clang::TranslationUnit&)
/usr/local/lib/libclangCodeGen.a(ModuleBuilder.o) reference to  
undefined clang::ASTConsumer::~ASTConsumer()
...
/usr/local/lib/libclangCodeGen.a(CGObjC.o) reference to undefined  
vtable for clang::DeclRefExpr
/usr/local/lib/libclangCodeGen.a(CGObjC.o) reference to undefined  
vtable for clang::BinaryOperator
...
/usr/local/lib/libLLVMCodeGen.a(LiveIntervalAnalysis.o) reference to  
undefined typeinfo for llvm::AliasAnalysis
/usr/local/lib/libLLVMipo.a(GlobalOpt.o) reference to undefined  
llvm::ConstantFoldCall(llvm::Function*, llvm::Constant* const*,  
unsigned int)
/usr/local/lib/libLLVMipo.a(GlobalOpt.o) reference to undefined  
llvm::ConstantFoldInstruction(llvm::Instruction*, llvm::TargetData  
const*)
/usr/local/lib/libLLVMipo.a(GlobalOpt.o) reference to undefined  
llvm::ConstantFoldLoadThroughGEPConstantExpr(llvm::Constant*,  
llvm::ConstantExpr*)
/usr/local/lib/libLLVMipo.a(InlineSimple.o) reference to undefined  
llvm::CallGraphLinkVar
/usr/local/lib/libLLVMipo.a(InlineSimple.o) reference to undefined  
llvm::CallGraphSCCPass::assignPassManager(llvm::PMStack&,  
llvm::PassManagerType)
/usr/local/lib/libLLVMipo.a(InlineSimple.o) reference to undefined  
vtable for llvm::CallGraphSCCPass
...
and so on.

Thanks for any help or advice you can offer!





More information about the llvm-dev mailing list