Ketika saya mengkompilasi openvswitch-1.5.0, saya telah menemukan kesalahan kompilasi berikut:
gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
-Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init -g -O2 -export-dynamic ***-lpthread*** -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
/home/jyyoo/src/dpdk/build/lib/librte_eal.a
/home/jyyoo/src/dpdk/build/lib/libethdev.a
/home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
/home/jyyoo/src/dpdk/build/lib/librte_hash.a
/home/jyyoo/src/dpdk/build/lib/librte_lpm.a
/home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
/home/jyyoo/src/dpdk/build/lib/librte_ring.a
/home/jyyoo/src/dpdk/build/lib/librte_mempool.a
/home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm
/usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
to symbol 'pthread_create@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from
command line
Jika saya mencoba melihat simbol-simbol libpthread
, itu terlihat baik-baik saja.
$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
199: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2.5
173: 0000000000008220 2814 FUNC LOCAL DEFAULT 13 __pthread_create_2_1
462: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2
Bisakah Anda memberikan petunjuk atau petunjuk?
gcc
tidakg++
Jawaban:
Anda harus menyebutkan pustaka pada baris perintah setelah file objek dikompilasi:
Penjelasan: tautannya tergantung pada urutan modul. Simbol pertama kali diminta, dan kemudian ditautkan dari perpustakaan yang memilikinya. Jadi, Anda harus menentukan modul yang menggunakan perpustakaan terlebih dahulu, dan perpustakaan setelahnya. Seperti ini:
Selain itu, jika ada ketergantungan melingkar, Anda harus menentukan pustaka yang sama pada baris perintah beberapa kali. Jadi jika
libb
perlu simbol darilibc
danlibc
membutuhkan simbol darilibb
, baris perintah harus:sumber
-Wl,--start-group -la -lb- -lc -Wl,--end-group
untuk dependensi melingkar.Pesan kesalahan tergantung pada versi distribusi / kompiler:
Ubuntu Saucy:
Ubuntu Raring: (lebih informatif)
Solusi: Anda mungkin kehilangan perpustakaan dalam langkah kompilasi Anda, selama tahap penautan. Dalam kasus saya, saya menambahkan '-lz' ke flag makefile / GCC.
Latar Belakang: DSO adalah objek bersama dinamis atau perpustakaan bersama.
sumber
glewInit
, Anda perlu-lGLEW
Latar Belakang
Itu
DSO missing from command line
pesan akan ditampilkan ketika linker tidak menemukan simbol yang diperlukan dengan itu pencarian normal tapi simbol tersedia di salah satu dependensi dari sebuah perpustakaan yang dinamis langsung ditentukan.Di masa lalu linker dianggap simbol dalam dependensi dari bahasa yang ditentukan tersedia. Tetapi itu berubah dalam beberapa versi kemudian dan sekarang tautan membuat pandangan yang lebih ketat tentang apa yang tersedia. Dengan demikian pesan ini dimaksudkan untuk membantu transisi itu.
Apa yang harus dilakukan?
Jika Anda adalah pengelola perangkat lunak
Anda harus menyelesaikan masalah ini dengan memastikan bahwa semua perpustakaan yang diperlukan untuk memenuhi simbol yang diperlukan secara langsung ditentukan pada baris perintah linker. Juga perlu diingat bahwa ketertiban sering kali penting.
Jika Anda hanya mencoba untuk mengkompilasi perangkat lunak
Sebagai solusinya, dimungkinkan untuk beralih kembali ke tampilan yang lebih permisif tentang simbol apa yang tersedia dengan menggunakan opsi
-Wl,--copy-dt-needed-entries
.Cara umum untuk menyuntikkan ini ke build adalah dengan mengekspor LDFLAGS sebelum berjalan
configure
atau serupa seperti ini:Terkadang lewat
LDFLAGS="-Wl,--copy-dt-needed-entries"
langsung kemake
mungkin juga berhasil.sumber
-Wl,
bitnya, atau Anda memiliki tautan yang tidak mendukung opsi ini. Tautan apa yang Anda gunakan? Jawaban ini mengasumsikan tautan binutils klasik (ld.bfd). Tautan emas binutils (ld.gold) mendokumentasikan--copy-dt-needed-entries
sebagai "Tidak didukung". Jadi, jika Anda memiliki itu (atau tautan lain yang tidak mendukung opsi ini) sebagai default, Anda mungkin perlu mengikuti bagian untuk pengelola atau beralih ke ld klasik untuk menghubungkan. Saya pikir Anda dapat menggunakannya-fuse-ld=ld.bfd
untuk itu.Saya menemukan kasus lain dan karena itu saya anggap Anda semua salah.
Inilah yang saya miliki:
Masalahnya adalah bahwa baris perintah TIDAK mengandung
-lX11
- meskipun libX11.so harus ditambahkan sebagai dependensi karena ada juga pustaka GTK dan GNOME dalam argumen.Jadi, satu-satunya penjelasan bagi saya adalah bahwa pesan ini mungkin dimaksudkan untuk membantu Anda , tetapi tidak melakukannya dengan benar. Ini mungkin sederhana: perpustakaan yang menyediakan simbol tidak ditambahkan ke baris perintah.
Harap perhatikan tiga aturan penting terkait tautan di POSIX:
-l<name>
, Anda tidak pernah tahu apakah akan mengambillib<name>.so
ataulib<name>.a
. Perpustakaan dinamis lebih disukai, jika ditemukan, dan perpustakaan statis hanya dapat ditegakkan dengan opsi kompiler - itu saja. Dan apakah Anda memiliki masalah seperti di atas, itu tergantung pada apakah Anda memiliki perpustakaan statis atau dinamissumber
Saya menemukan kesalahan yang sama. Saya mengkompilasi kode dengan lapack dan blas. Ketika saya mengganti urutan kedua pustaka yang disebut kesalahan itu hilang.
"LAPACK_LIB = -llapack -lblas" bekerja di mana "LAPACK_LIB = -lblas -llapack" memberikan kesalahan yang dijelaskan di atas.
sumber
find_package(Threads)
dantarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
Saya juga mengalami masalah yang sama. Saya tidak tahu mengapa, saya hanya menambahkan
-lpthread
opsi ke kompiler dan semuanya baik-baik saja.Tua:
mendapat kesalahan berikut. Jika saya menambahkan
-lpthread
opsi ke perintah di atas maka OK.sumber
Apa yang saya temukan adalah bahwa kadang-kadang perpustakaan yang dikeluhkan linker bukan yang menyebabkan masalah. Mungkin ada cara cerdas untuk mencari tahu di mana masalahnya tapi ini yang saya lakukan:
@ Peter Karasev: Saya telah menemukan masalah yang sama dengan proyek gake 4.8.2 cmake pada CentOS7. Urutan perpustakaan di bagian "target_link_libraries" penting. Saya kira cmake hanya meneruskan daftar ke linker apa adanya, yaitu tidak mencoba dan mengerjakan urutan yang benar. Ini masuk akal - ketika Anda memikirkannya, cmake tidak bisa tahu apa urutan yang benar sampai tautan berhasil diselesaikan.
sumber
Silakan tambahkan:
CFLAGS="-lrt"
danLDFLAGS="-lrt"
sumber
Masalah yang sama terjadi pada saya ketika saya gunakan
distcc
untuk membuat proyek c ++ saya; Akhirnya saya menyelesaikannya denganexport CXX="distcc g++"
.sumber
jika Anda menggunakan cmake dan pthreads bekas, coba tambahkan baris berikut
sumber
Hal yang sama terjadi pada saya ketika saya menginstal benchmark HPCC (termasuk HPL dan beberapa tolok ukur lainnya). Saya menambahkan
-lm
bendera compiler di skrip build saya dan kemudian berhasil dikompilasi.sumber
Jika menggunakan
g++
, pastikan bahwa Anda tidak menjalankangcc
bukannyasumber
Coba tambahkan
-pthread
di akhir daftar perpustakaan di Makefile .Ini berhasil untuk saya.
sumber
Jika Anda menggunakan CMake, ada beberapa cara yang bisa Anda selesaikan:
Solusi 1: Yang paling elegan
Solusi 2: menggunakan CMake
find_package
Solusi 3: Ubah flag CMake
sumber