Saya mencoba mengompilasi program di Ubuntu 11.10 yang menggunakan perpustakaan Boost. Saya memiliki pustaka Boost 1.46-dev dari Repositori Ubuntu yang diinstal, tetapi saya mendapatkan kesalahan saat menyusun program.
undefined reference to boost::system::system_category()
Apa yang saya lakukan salah?
Jawaban:
Pustaka boost yang Anda gunakan bergantung pada pustaka boost_system. (Tidak semuanya melakukannya.)
Dengan asumsi Anda menggunakan gcc, coba tambahkan
-lboost_system
ke baris perintah kompiler Anda untuk menautkan ke pustaka itu.sumber
-lboost_system
, sehingga tampak seperti ini:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. Itu tidak membantu ...autoreconf
sesudahnya? Juga, posting ini dan yang ini mungkin membantu Anda dengan konfigurasi autotools Anda.sslsniff_LDFLAGS
dengansslsniff_LDADD
di Makefile.am dan itu TIDAK berhasil. Kemudian saya menyimpan keduanyasslsniff_LDFLAGS
dan menambahkansslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Kemudian saya bisa mengkompilasi. Terima kasih atas bantuannya!Menghubungkan dengan perpustakaan yang mendefinisikan simbol yang hilang (
-lboost_system
) adalah solusi yang jelas, tetapi dalam kasus tertentu dari Boost.System, kesalahan dalam desain aslinya membuatnya digunakanboost::system::generic_category()
danboost::system::system_category()
tidak perlu. Mengompilasi dengan bendera-DBOOST_SYSTEM_NO_DEPRECATED
menonaktifkan kode itu dan memungkinkan sejumlah program dikompilasi tanpa memerlukan-lboost_system
(tautan itu tentu saja masih diperlukan jika Anda secara eksplisit menggunakan beberapa fitur perpustakaan).Mulai dari Boost 1.66 dan commit ini , perilaku ini sekarang menjadi default, jadi semoga semakin sedikit pengguna yang membutuhkan jawaban ini.
Seperti yang diperhatikan oleh @AndrewMarshall, alternatifnya adalah dengan menentukan
BOOST_ERROR_CODE_HEADER_ONLY
mana yang memungkinkan versi kode hanya-header. Ini tidak disarankan oleh Boost karena dapat merusak beberapa fungsionalitas. Namun, sejak 1.69, header-only tampaknya telah menjadi default , yang seharusnya membuat pertanyaan ini menjadi usang.sumber
BOOST_ERROR_CODE_HEADER_ONLY
.Solusi lain bagi mereka yang tidak membutuhkan seluruh shebang: gunakan sakelar
-DBOOST_ERROR_CODE_HEADER_ONLY
.Jika Anda menggunakan CMake, itu
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.sumber
Kesalahan di atas adalah kesalahan penaut ... penaut adalah program yang mengambil satu atau lebih objek yang dihasilkan oleh kompiler dan menggabungkannya menjadi satu program yang dapat dijalankan.
Anda harus menambahkan
-lboost_system
kepada Anda bendera penaut yang menunjukkan kepada penaut bahwa penaut harus mencari simbol sepertiboost::system::system_category()
di pustakalibboost_system.so
.Jika Anda memiliki main.cpp, salah satunya:
ATAU
sumber
Saat menggunakan CMAKE dan find_package, pastikan:
dan tidak
Beberapa orang mungkin kehilangan waktu berjam-jam untuk itu ...
sumber
Saya mendapat masalah yang sama:
Solusinya adalah menggunakan versi debug dari system-lib:
Tapi kenapa?
sumber
Saat saya mengalami ini, masalah, penyebabnya adalah penataan perpustakaan. Untuk memperbaikinya, saya menempatkan
libboost_system
:Ini di mingw dengan gcc 5.3 dan meningkatkan 1.61.0 dengan contoh timer sederhana.
sumber
dalam kasus saya, menambahkan
-lboost_system
saja tidak cukup, masih tidak dapat menemukannya di lingkungan build kustom saya. Saya harus menggunakan saran di Singkirkan "gcc - / usr / bin / ld: peringatan lib tidak ditemukan" dan ubah./configure
perintah saya menjadi:untuk lebih jelasnya lihat Boost 1.51: "error: tidak dapat menautkan ke boost_thread!"
sumber
... dan jika Anda ingin menautkan utama Anda secara statis, di Jamfile Anda tambahkan yang berikut ke persyaratan:
dan mungkin juga:
sumber