derleme sırasında boost :: system :: system_category () 'a tanımsız başvuru


105

Ubuntu 11.10'da Boost kitaplıklarını kullanan bir program derlemeye çalışıyorum. Ubuntu Deposundaki 1.46-dev Boost kitaplıklarına sahibim, ancak programı derlerken bir hata alıyorum.

undefined reference to boost::system::system_category()

Yanlış yaptığım şey nedir?


6
Bu bir derleyici hatası değil, bu bir bağlayıcı hatası. Boost.System kitaplığına bağlanmanız gerekir.
ildjarn

Yanıtlar:


160

Kullandığınız destek kitaplığı boost_system kitaplığına bağlıdır. (Hepsi yapmıyor.)

Gcc kullandığınızı varsayarak, -lboost_systembu kitaplığa bağlanmak için derleyicinizin komut satırına eklemeyi deneyin .


3
Derleme için bir g ++ Makefile kullanıyorum. Bu tür bayraklar genellikle nereye yerleştirilir?
user1049697

2
Derleyici / bağlayıcı komut satırının nasıl birleştirildiği durumdan duruma büyük ölçüde değişir. Makefile dosyanızı (veya ilgili kısımlarını) neden sorunuza yapıştırmıyorsunuz? Bu şekilde, özel durumunuzda işe yarayan bir cevap alabilirsiniz.
hc_

7
Tamam, Makefile.am düzenlenmiş ve ilave -lboost_system, bu nedenle bu gibi görünüyordu: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Yine de yardımcı olmadı ...
user1049697

1
Hala aynı hata mı? Çalıştırmak mı autoreconfsonradan? Ayrıca, bu gönderi ve bu , otomatik araçlar yapılandırmanızda size yardımcı olabilir.
hc_

2
Makefile.am sslsniff_LDFLAGSile değiştirdim sslsniff_LDADDve bu işe yaramadı. Sonra ikisini de sakladım sslsniff_LDFLAGSve ekledim sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Sonra derleyebildim. Yardım için teşekkürler!
user1049697

62

Eksik sembolü ( -lboost_system) tanımlayan bir kitaplık ile bağlantı kurmak bariz çözümdür, ancak özel Boost.System durumunda, orijinal tasarımdaki bir yanlışlık onu gereksiz yere kullanır boost::system::generic_category()ve boost::system::system_category()gereksiz kılar . Bayrakla derleme, -DBOOST_SYSTEM_NO_DEPRECATEDbu kodu devre dışı bırakır ve bir dizi programın gerekmeden derlenmesine izin verir -lboost_system(bu bağlantı, eğer kitaplığın özelliklerinden bazılarını açıkça kullanıyorsanız tabii ki hala gereklidir).

Boost 1.66'dan başlayarak ve bu commit , bu davranış artık varsayılandır, bu yüzden umarım daha az ve daha az sayıda kullanıcı bu cevaba ihtiyaç duyar.

@AndrewMarshall tarafından fark edildiği gibi, bir alternatif, BOOST_ERROR_CODE_HEADER_ONLYkodun yalnızca başlık sürümüne izin veren tanımlamanın yapılmasıdır. Bu, bazı işlevleri bozabileceği için Boost tarafından önerilmedi . Bununla birlikte, 1.69'dan beri, yalnızca başlık varsayılan olarak görünüyor ve bu soruyu sözde geçersiz kılıyor.


4
Teşekkürler!!! Beni serbest bırakan tek şey boost 1.41 (Centos SL) kullandığımdan beri hiçbir şey yardımcı olmadı, -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
Aslında isteyebileceğiniz şey -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
İlginç bir şekilde, system_category () vb . İçin daha az referansa sahip olan yeni Boost 1.66 davranışı , bağlantı sıralama sorunları varlığında yeni bağlantı sorunları ortaya çıkarabilir . Örneğin
github.com/PointCloudLibrary/pcl/pull/2236

3
CMake kullanıyorsanız sadece 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)' ekleyin
nickolay

1
Boost 1.68 ile benim için çalışan tek sabit, tanımlamaktı BOOST_ERROR_CODE_HEADER_ONLY.
sakra

17

Sorunun tamamına ihtiyaç duymayanlar için başka bir çözüm: anahtarı kullanın

-DBOOST_ERROR_CODE_HEADER_ONLY.

CMake kullanıyorsanız, bu add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).


1
Geçenlerde bu problemle karşılaştım. Bunun dışında hiçbir şey çalışmıyor. Marc Glisse'nin cevabında belirtildiği gibi, bu hala destek tarafından cesaret kırılmış mı merak ediyorum.
John Z. Li

1
alıntı "Boost.System artık yalnızca başlık. Uyumluluk için hala bir saplama kitaplığı oluşturuldu, ancak ona bağlanmak artık gerekli değil."
John Z. Li

16

Yukarıdaki hata bir bağlayıcı hatasıdır ... bağlayıcı , bir derleyici tarafından oluşturulan bir veya daha fazla nesneyi alan ve bunları tek bir yürütülebilir programda birleştiren bir programdır.

-lboost_systemBağlayıcıya boost::system::system_category()kitaplıktaki gibi semboller araması gerektiğini belirten bağlayıcı bayrakları eklemelisiniz .libboost_system.so .

Main.cpp'niz varsa, ya:

g++ main.cpp -o main -lboost_system

VEYA

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
-l ile kitaplık adı arasındaki boşluk yanlış. -lboost_system
portforwardpodcast

1
Centos'un -l'nin konumunu önemsemediğini ama ubuntu'nun ilgilendiğini, sonunda olması gerektiğini buldum.
soruldu

7

CMAKE ve find_package kullanırken şunlardan emin olun:

find_package(Boost COMPONENTS system ...)

ve yok

find_package(boost COMPONENTS system ...)

Bazı insanlar bunun için saatlerini kaybetmiş olabilir ...


6

Aynı Sorunu yaşıyorum:

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): `boost :: system :: generic_category () 'a tanımsız başvuru

Çözüm, sistem kitaplığının hata ayıklama sürümünü kullanmaktı:

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

Ama neden?


1
Bir yerde bir hata ayıklama bayrağı tanımlanmış olabilir, bu nedenle hata ayıklamada yerleşik başka kitaplıklar olabilir veya g ++ hata ayıklama objesi üretiyordu?
öğlen

4

Bunu yaşadığımda, sorun, nedeni kütüphanelerin sıralanmasıydı. Düzeltmek için libboost_systemen son:

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

Bu, gcc 5.3 ile karıştırıldı ve basit bir zamanlayıcı örneğiyle 1.61.0'ı artırdı.


1
Bu benim de sorunumdu. Bunu CMake aracılığıyla dahil ettim ve herhangi bir nedenle varsayılan bağımlılıklar ve sıralama FindBoost komut dosyasında yapıldı. Gerçekten de benim sorunum her zaman paylaşılan kitaplıkları kullanmak ve asla dikkat etmemek, sonra statik kitaplıklara geçmek ve derleme hataları almaktı. Oops.
Anthony

Bu benim için de düzeltti ... Bu çözümden önce işe yarayan tek şey BOOST_ERROR_CODE_HEADER_ONLY'i tanımlamaktı. Ubuntu 18.04'te cmake ile 1.68'i artırın. Düzeltmem: target_link_libraries (yürütülebilir pthread ssl crypto boost_system)
Luis

2

benim durumumda eklemek -lboost_systemyeterli değildi, yine de özel yapım ortamımda bulamadı. "Gcc - / usr / bin / ld: uyarı lib bulunamadı" bölümündeki tavsiyeleri kullanmak zorunda kaldım ve ./configurekomutumu şu şekilde değiştirdim :

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

daha fazla ayrıntı için bkz. Boost 1.51: "hata: boost_thread ile bağlantı kurulamadı!"


1

... ve ana sayfanızı statik olarak bağlamak istemeniz durumunda, Jamfile'ınıza aşağıdakileri gereksinimlere ekleyin:

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

ve belki de:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.