LLVMチュートリアル で作業していますが、コンパイルに問題があります。私は問題を再現する最小限の例を書きました:
#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;
}
コンパイルしようとすると、「未定義の参照」エラーがたくさん表示されます。
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
Dladdrのマンページを表示すると、-ldl
とリンクする必要があると表示されます。しかし、私はすでに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
また、-ldl
は正しい順序で表示されます(つまり、.o
ファイルの後に記号が必要です)。
この問題をデバッグする次のステップに迷っています。誰かが私を正しい方向に向けることができますか? Ubuntu 12.04でLVVM 2.9-7を実行しています。
シンボルを必要とするライブラリは-lLLVMSupport
に含まれているため、-ldl
は-lLLVMSupport
の後に置く必要があります。私はこれを変更しました:
`llvm-config --ldflags --libs core`
これに:
`llvm-config --libs core` `llvm-config --ldflags`
そして、リンカーは成功しました。
Llvm-3.4のLLVMチュートリアルで同じ問題が発生していましたが、残念ながら、Matthewからの回答は役に立ちませんでした。今後の参考のために、私が遭遇した問題とそれをどのように修正したかについて、新しい回答を投稿します。
LLVMを~/dev/llvm/install
にインストールしたので、チュートリアルで指定されたコマンドを使用していましたが、llvm-config
をllvmインストールのパスに置き換えました。
clang++ -g -O3 toy.cpp `../llvm/install/bin/llvm-config --cppflags --ldflags --libs core` -o toy
私はたくさんのエラーを受け取りました、最初のエラーは:
filipe@filipe-Kubuntu:~/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
^
これは、現時点でLLVMがC++ 11コンパイラを必要とするためです。 -std=c++11
をclang++
オプションに追加すると解決しました。しかし、私は得ました:
filipe@filipe-Kubuntu:~/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)
元の質問の作者で起こったこととは逆に、llvm-config
がシステムライブラリにリンクしていなかったことがわかりました。次に、目的のシステムライブラリをリンクプロセスに含めるために--system-libs
を使用する必要があると考えました。
clang++ -std=c++11 -g -O3 toy.cpp `../llvm/install/bin/llvm-config --cppflags --libs core --ldflags --system-libs` -o toy
常に--system-libs
を最後に置くことが重要です。これにより、不足しているすべての依存関係がリンカーによって取り込まれます。
LLVM 3.4およびKubuntu 14.04でテスト済み