2012-10-20 10 views
24

Bir LLVM Tutorial aracılığıyla çalışıyorum, ancak derleme konusunda sorun yaşıyorum. Ben dladdr için manpage görüntülersenizNeden bu basit program için -ldl ile bile "dladdr" tanımlanmamış referansını alıyorum?

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 

: Ben derlemeye çalıştığınızda

#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; 
} 

, ben 'tanımsız referansı' Standardizasyon ve Kalibrasyon bir demet olsun: Sorunu yeniden üreten bir asgari örnek yazdım , -ldl ile bağlantı kurmam gerektiğini söylüyor. Ama zaten llvm-config o yapıyorum:

$ 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 

Ayrıca, -ldl doğru sırayla görünür (yani semboller gerektirir .o dosyası sonra).

Bu sorunun hatalarını ayıklamak için bir sonraki adıma zarar veriyorum. Beni doğru yöne yönlendiren var mı? Ubuntu 12.04'te LVVM 2.9-7 koşuyorum.

cevap

31

Semboller gerektiren kütüphane -lLLVMSupport, -ldl tarafından -lLLVMSupport'dan sonra gelmelidir. Buna

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

: Ben bu değişti

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

Ve bağlayıcı başarılı oldu.

+6

Umarım LLVM 3.4 ve Kubuntu ile test edilmiştir. – deadalnix

11

llvm-3.4 için LLVM öğreticisinden geçerken aynı sorunu yaşıyordum ve maalesef Matthew'ın yanıtı yardımcı olmadı. Gelecekte başvurmak için, karşılaştığım sorunlar ve bunları nasıl düzelttiğimi yeni bir cevap gönderiyorum.

ben ~/dev/llvm/install yılında LLVM yüklemiş, bu yüzden öğretici verilen komutunu kullanarak, ama benim LLVM kurulum için yolu ile llvm-config değiştirilir: Ben hataların bir ton var

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

, ilki :

[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 
     ^

Bu noktada LLVM bir C++ 11 derleyicisine gereksinim duyar; -std=c++11 eklendiğinde clang++ seçenekleri çözüldü. Ama sonra var: Orijinal soruya yazarı ya olanlarla

[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) 

aksine, ben llvm-config bile herhangi bir sistem kütüphanesine karşı bağlama değildi fark ettim. Tüm eksik bağımlılıkları tarafından getirilen böylece

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

O sonunda hep --system-libs koymak önemlidir: O zaman ben bağlama işlemini içine istenen sistem kütüphanelerini dahil etmek amacıyla --system-libs kullanmak gerektiğini düşündüm bağlayıcı.

http://xkcd.com/979/ teşekkür ederiz olarak sona erdi vermedi 14.04

+4

+1. clang 3.5 ile, '--system-libs' bana yardımcı oldu. –

+4

Ayrıca clang 3.5 ile başarıyla derlemek için --system-libs gerekli. Bu müthiş modüler kütüphaneler dizisini yaparlar ve daha sonra onlara karşı bağ kurabilmek neredeyse imkansızdır. – korrok

İlgili konular