referensi tidak terdefinisi untuk meningkatkan :: system :: system_category () saat kompilasi

105

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?

pengguna1049697
sumber
6
Itu bukan kesalahan kompiler, ini kesalahan penaut . Anda perlu menautkan ke pustaka Boost.System.
ildjarn

Jawaban:

160

Pustaka boost yang Anda gunakan bergantung pada pustaka boost_system. (Tidak semuanya melakukannya.)

Dengan asumsi Anda menggunakan gcc, coba tambahkan -lboost_systemke baris perintah kompiler Anda untuk menautkan ke pustaka itu.

hc_
sumber
3
Saya menggunakan g ++ Makefile untuk kompilasi. Di mana biasanya orang memasang bendera seperti itu?
pengguna1049697
2
Bagaimana baris perintah compiler / linker dirakit sangat bervariasi dari kasus ke kasus. Mengapa Anda tidak menempelkan Makefile Anda (atau bagian yang relevan darinya) ke dalam pertanyaan Anda? Dengan begitu, Anda bisa mendapatkan jawaban yang sesuai dengan kasus Anda.
hc_
7
Ok, saya edit Makefile.am dan menambahkan -lboost_system, sehingga tampak seperti ini: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Itu tidak membantu ...
user1049697
1
Masih error yang sama? Apakah Anda lari autoreconfsesudahnya? Juga, posting ini dan yang ini mungkin membantu Anda dengan konfigurasi autotools Anda.
hc_
2
Saya menggantinya sslsniff_LDFLAGSdengan sslsniff_LDADDdi Makefile.am dan itu TIDAK berhasil. Kemudian saya menyimpan keduanya sslsniff_LDFLAGSdan menambahkan sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Kemudian saya bisa mengkompilasi. Terima kasih atas bantuannya!
pengguna1049697
62

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 digunakan boost::system::generic_category()dan boost::system::system_category()tidak perlu. Mengompilasi dengan bendera -DBOOST_SYSTEM_NO_DEPRECATEDmenonaktifkan 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_ONLYmana 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.

Marc Glisse
sumber
4
Terima kasih!!! tidak ada yang membantu karena saya menggunakan boost 1.41 (Centos SL), satu-satunya hal yang membebaskan saya, adalah menggunakan -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit
5
Sebenarnya yang mungkin Anda inginkan adalah -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall
1
Menariknya, perilaku Boost 1.66 yang baru karena memiliki lebih sedikit referensi ke system_category () dll. Dapat menyebabkan masalah tautan baru dengan adanya masalah pengurutan tautan. Lihat github.com/PointCloudLibrary/pcl/pull/2236 misalnya
pixelbeat
3
Jika Anda menggunakan CMake, cukup tambahkan 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)'
nickolay
1
Satu-satunya perbaikan yang berhasil untuk saya dengan Boost 1,68 adalah dengan mendefinisikan BOOST_ERROR_CODE_HEADER_ONLY.
sakra
17

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

Vadim Berman
sumber
1
Saya baru-baru ini menemukan masalah ini. Tidak ada yang berhasil kecuali yang ini. Saya ingin tahu apakah ini masih patah semangat dengan dorongan seperti yang disebutkan dalam jawaban Marc Glisse.
John Z. Li
1
kutipan "Boost.System sekarang hanya untuk header. Pustaka rintisan masih dibuat untuk kompatibilitas, tetapi menautkannya tidak lagi diperlukan."
John Z. Li
16

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_systemkepada Anda bendera penaut yang menunjukkan kepada penaut bahwa penaut harus mencari simbol seperti boost::system::system_category()di pustaka libboost_system.so.

Jika Anda memiliki main.cpp, salah satunya:

g++ main.cpp -o main -lboost_system

ATAU

g++ -c -o main.o main.cpp
g++ main.o -lboost_system
pengguna1055604
sumber
5
spasi antara -l dan nama perpustakaan salah. Anda harus menggunakan -lboost_system
portforwardpodcast
1
Saya menemukan bahwa centos tidak peduli dengan posisi -l tetapi ubuntu peduli, harus di bagian akhir.
ask_io
7

Saat menggunakan CMAKE dan find_package, pastikan:

find_package(Boost COMPONENTS system ...)

dan tidak

find_package(boost COMPONENTS system ...)

Beberapa orang mungkin kehilangan waktu berjam-jam untuk itu ...

Kriegalex
sumber
6

Saya mendapat masalah yang sama:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Text + 0x54): referensi tidak ditentukan ke `boost :: system :: generic_category ()

Solusinya adalah menggunakan versi debug dari system-lib:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

Tapi kenapa?

volker
sumber
1
Mungkinkah di suatu tempat telah didefinisikan beberapa tanda debug, jadi Anda memiliki lib lain yang dibangun di debug atau g ++ menghasilkan debug obj?
noonex
4

Saat saya mengalami ini, masalah, penyebabnya adalah penataan perpustakaan. Untuk memperbaikinya, saya menempatkan libboost_system:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

Ini di mingw dengan gcc 5.3 dan meningkatkan 1.61.0 dengan contoh timer sederhana.

Min Zhang
sumber
1
Ini juga masalahku. Saya memasukkannya melalui CMake dan, untuk alasan apa pun, dependensi yang diasumsikan dan pengurutan berhasil di skrip FindBoost. Sungguh, masalah saya selalu menggunakan perpustakaan bersama dan tidak pernah memperhatikan, kemudian pindah ke perpustakaan statis dan mendapatkan kesalahan pembuatan. Ups.
Anthony
Ini memperbaikinya untuk saya juga ... sebelum solusi ini, satu-satunya hal yang berhasil adalah mendefinisikan BOOST_ERROR_CODE_HEADER_ONLY. Di Ubuntu 18.04, tingkatkan 1,68, dengan cmake. Perbaikan saya: target_link_libraries (pthread ssl crypto boost_system yang dapat dieksekusi)
Luis
2

dalam kasus saya, menambahkan -lboost_systemsaja 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 ./configureperintah saya menjadi:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

untuk lebih jelasnya lihat Boost 1.51: "error: tidak dapat menautkan ke boost_thread!"

jcomeau_ictx
sumber
1

... dan jika Anda ingin menautkan utama Anda secara statis, di Jamfile Anda tambahkan yang berikut ke persyaratan:

<link>static
<library>/boost/system//boost_system

dan mungkin juga:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
formiaczek.dll
sumber