2012-10-20 17 views
24

Sto lavorando tramite un LLVM Tutorial, ma ho problemi di compilazione. Ho scritto un esempio minimo che riproduce il problema:Perché sto ottenendo "riferimento non definito a` dladdr '"anche con -ldl per questo semplice programma?

#include "llvm/Module.h" 
#include "llvm/LLVMContext.h" 

int main(int argc, char **argv) { 
    llvm::Module *module = new llvm::Module("test", llvm::getGlobalContext()); 
    return 0; 
} 

Quando provo a compilare, ottengo un mazzo di erros 'undefined' di riferimento:

clang++ `llvm-config --cxxflags` -c -o test.o test.cpp 
clang++ test.o `llvm-config --ldflags --libs core` -o test 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Signals.o): In function `PrintStackTrace(void*)': 
(.text+0x6c): undefined reference to `dladdr' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Signals.o): In function `PrintStackTrace(void*)': 
(.text+0x1f6): undefined reference to `dladdr' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::MutexImpl(bool)': 
(.text+0x53): undefined reference to `pthread_mutexattr_init' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::MutexImpl(bool)': 
(.text+0x64): undefined reference to `pthread_mutexattr_settype' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::MutexImpl(bool)': 
(.text+0x74): undefined reference to `pthread_mutexattr_setpshared' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::MutexImpl(bool)': 
(.text+0x88): undefined reference to `pthread_mutexattr_destroy' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::tryacquire()': 
(.text+0x179): undefined reference to `pthread_mutex_trylock' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::RWMutexImpl()': 
(.text+0x3e): undefined reference to `pthread_rwlock_init' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::~RWMutexImpl()': 
(.text+0x80): undefined reference to `pthread_rwlock_destroy' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::reader_acquire()': 
(.text+0xb9): undefined reference to `pthread_rwlock_rdlock' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::reader_release()': 
(.text+0xe9): undefined reference to `pthread_rwlock_unlock' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::writer_acquire()': 
(.text+0x119): undefined reference to `pthread_rwlock_wrlock' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::writer_release()': 
(.text+0x149): undefined reference to `pthread_rwlock_unlock' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Threading.o): In function `llvm::llvm_execute_on_thread(void (*)(void*), void*, unsigned int)': 
(.text+0x1cc): undefined reference to `pthread_create' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Threading.o): In function `llvm::llvm_execute_on_thread(void (*)(void*), void*, unsigned int)': 
(.text+0x208): undefined reference to `pthread_attr_setstacksize' 
/usr/lib/llvm-2.9/lib/libLLVMSupport.a(Threading.o): In function `llvm::llvm_execute_on_thread(void (*)(void*), void*, unsigned int)': 
(.text+0x228): undefined reference to `pthread_join' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [test] Error 1 

Se visualizzo la pagina di manuale per dladdr , dice che devo collegarmi con -ldl. Ma sto già facendo con llvm-config:

$ llvm-config --ldflags --libs core 
-L/usr/lib/llvm-2.9/lib -lpthread -lffi -ldl -lm 
-lLLVMCore -lLLVMSupport -L/usr/lib/llvm-2.9/lib 

Inoltre, -ldl appare nell'ordine corretto (vale a dire, dopo che il file .o che richiede i simboli).

Sono in perdita per il prossimo passo nel debug di questo problema. Qualcuno può indicarmi la giusta direzione? Sto eseguendo LVVM 2.9-7 su Ubuntu 12.04.

risposta

31

La libreria che richiede i simboli è inclusa da -lLLVMSupport, pertanto -ldl deve venire dopo -lLLVMSupport. Ho cambiato questo:

`llvm-config --ldflags --libs core` 

A tal:

`llvm-config --libs core` `llvm-config --ldflags` 

E il linker ha avuto successo.

+6

Si spera, non ha concluso come http://xkcd.com/979/ Grazie. – deadalnix

11

Avevo lo stesso problema durante il tutorial su LLVM per llvm-3.4 e, sfortunatamente, la risposta di Matthew non mi è stata di aiuto. Per riferimento futuro, sto postando una nuova risposta con i problemi che ho incontrato e come l'ho risolto.

Ho installato LLVM in ~/dev/llvm/install, quindi ero utilizzando il comando dato nel tutorial, ma sostituito llvm-config con il percorso per la mia installazione LLVM:

clang++ -g -O3 toy.cpp `../llvm/install/bin/llvm-config --cppflags --ldflags --libs core` -o toy 

ho avuto un sacco di errori, il primo era:

[email protected]:~/dev/kaleidoscope$ clang++ -g -O3 toy.cpp `../llvm/install/bin/llvm-config --cppflags --ldflags --libs core` -o toy 
In file included from toy.cpp:1: 
In file included from /home/filipe/dev/llvm/install/include/llvm/IR/Verifier.h:24: 
/home/filipe/dev/llvm/install/include/llvm/ADT/StringRef.h:342:14: error: no template named 'enable_if' in namespace 'std'; did you mean 
     '__gnu_cxx::__enable_if'? 
    typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type 
      ^~~~~~~~~~~~~~ 
      __gnu_cxx::__enable_if 
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ext/type_traits.h:43:12: note: '__gnu_cxx::__enable_if' declared here 
    struct __enable_if 
     ^

Questo perché a questo punto LLVM richiede un compilatore C++ 11; aggiungendo -std=c++11 a clang++ opzioni risolto. Ma poi ho avuto:

[email protected]:~/dev/kaleidoscope$ clang++ -std=c++11 -g -O3 toy.cpp `../llvm/install/bin/llvm-config --cppflags --ldflags --libs core` -o toy 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(Process.o): In function `terminalHasColors(int)': 
/home/filipe/dev/llvm/llvm/lib/Support/Unix/Process.inc:273: undefined reference to `setupterm' 
/home/filipe/dev/llvm/llvm/lib/Support/Unix/Process.inc:291: undefined reference to `tigetnum' 
/home/filipe/dev/llvm/llvm/lib/Support/Unix/Process.inc:295: undefined reference to `set_curterm' 
/home/filipe/dev/llvm/llvm/lib/Support/Unix/Process.inc:296: undefined reference to `del_curterm' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(Signals.o): In function `llvm::sys::PrintStackTrace(_IO_FILE*)': 
/home/filipe/dev/llvm/llvm/lib/Support/Unix/Signals.inc:278: undefined reference to `dladdr' 
/home/filipe/dev/llvm/llvm/lib/Support/Unix/Signals.inc:290: undefined reference to `dladdr' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(Mutex.o): In function `MutexImpl': 
/home/filipe/dev/llvm/llvm/lib/Support/Mutex.cpp:53: undefined reference to `pthread_mutexattr_init' 
/home/filipe/dev/llvm/llvm/lib/Support/Mutex.cpp:59: undefined reference to `pthread_mutexattr_settype' 
/home/filipe/dev/llvm/llvm/lib/Support/Mutex.cpp:67: undefined reference to `pthread_mutexattr_destroy' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::tryacquire()': 
/home/filipe/dev/llvm/llvm/lib/Support/Mutex.cpp:109: undefined reference to `pthread_mutex_trylock' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(RWMutex.o): In function `RWMutexImpl': 
/home/filipe/dev/llvm/llvm/lib/Support/RWMutex.cpp:59: undefined reference to `pthread_rwlock_init' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(RWMutex.o): In function `~RWMutexImpl': 
/home/filipe/dev/llvm/llvm/lib/Support/RWMutex.cpp:72: undefined reference to `pthread_rwlock_destroy' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::reader_acquire()': 
/home/filipe/dev/llvm/llvm/lib/Support/RWMutex.cpp:82: undefined reference to `pthread_rwlock_rdlock' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::reader_release()': 
/home/filipe/dev/llvm/llvm/lib/Support/RWMutex.cpp:92: undefined reference to `pthread_rwlock_unlock' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::writer_acquire()': 
/home/filipe/dev/llvm/llvm/lib/Support/RWMutex.cpp:102: undefined reference to `pthread_rwlock_wrlock' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::writer_release()': 
/home/filipe/dev/llvm/llvm/lib/Support/RWMutex.cpp:112: undefined reference to `pthread_rwlock_unlock' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(ThreadLocal.o): In function `ThreadLocalImpl': 
/home/filipe/dev/llvm/llvm/lib/Support/ThreadLocal.cpp:56: undefined reference to `pthread_key_create' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(ThreadLocal.o): In function `~ThreadLocalImpl': 
/home/filipe/dev/llvm/llvm/lib/Support/ThreadLocal.cpp:63: undefined reference to `pthread_key_delete' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(ThreadLocal.o): In function `llvm::sys::ThreadLocalImpl::setInstance(void const*)': 
/home/filipe/dev/llvm/llvm/lib/Support/ThreadLocal.cpp:70: undefined reference to `pthread_setspecific' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(ThreadLocal.o): In function `llvm::sys::ThreadLocalImpl::getInstance()': 
/home/filipe/dev/llvm/llvm/lib/Support/ThreadLocal.cpp:77: undefined reference to `pthread_getspecific' 
/home/filipe/dev/llvm/install/lib/libLLVMSupport.a(Threading.o): In function `llvm::llvm_execute_on_thread(void (*)(void*), void*, unsigned int)': 
/home/filipe/dev/llvm/llvm/lib/Support/Threading.cpp:91: undefined reference to `pthread_attr_setstacksize' 
/home/filipe/dev/llvm/llvm/lib/Support/Threading.cpp:96: undefined reference to `pthread_create' 
/home/filipe/dev/llvm/llvm/lib/Support/Threading.cpp:100: undefined reference to `pthread_join' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Contrariamente a quello che è successo con l'autore della domanda originale, ho notato llvm-config non era nemmeno che collega contro qualsiasi libreria di sistema. Poi ho pensato che avevo bisogno di usare --system-libs al fine di includere le librerie di sistema desiderati nel processo di collegamento:

clang++ -std=c++11 -g -O3 toy.cpp `../llvm/install/bin/llvm-config --cppflags --libs core --ldflags --system-libs` -o toy 

E 'importante mettere sempre --system-libs, alla fine, in modo che tutte le dipendenze mancanti sono portati dal linker.

testato con LLVM 3.4 e Kubuntu 14.04

+4

+1. con clang 3.5, '--system-libs' mi ha aiutato. –

+4

Avevo anche bisogno di --system-libs per compilare correttamente clang 3.5. Fanno questo set di librerie meravigliosamente modulare e quindi è praticamente impossibile collegarli. – korrok

Problemi correlati