C ++ Boost: boost :: system :: generic_category () için tanımsız başvuru


92

BoostKütüphaneleri projeme dahil etmeye çalışıyorum ve aynı şekilde sorunlarla karşılaşıyorum. Codeblocks IDE ile Ubuntu 12.10'dayım ve siteden talimatları manuel olarak okuyarak kitaplıkları yüklemeyi denedim, ancak başlıkta ve kullanımdan önce oluşturulacak kitaplıklarda hatalar alıyordum.

Daha sonra kütüphaneleri terminalby üzerinden kurdum sudo apt-get install libboost-all-dev. Bundan sonra, Codeblocks'taki programlarımda, gibi başlıklar ekleyebilirim, #include <boost/regex.hpp>ancak Filesystem kitaplığı ( #include "boost/filesystem/operations.hpp" ) için başlık eklemeye çalıştığımda , aşağıdaki hatayı alıyorum:

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

Bu hatayı nasıl çözeceğimi bilmiyorum (özellikle Linux'taki Codeblocks'ta). Burada gerçekten biraz yardıma ihtiyacım var.

Derleyici: Gcc
Program kodu: Yalnızca yukarıdaki dosya sistemi operations.hppdosyasını dahil etmeyi denedi .

Codeblocks'tan günlük oluşturun:

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings


@pyCthon: Bu durumda, bunu Code :: bloklarında nasıl bağlayacağınız hakkında daha fazla ayrıntı ekleyebilir misiniz? Bağlayıcı bayrağını -lboost_systemayarların bir yerine eklemeyi denedim , ancak çözülmedi. Ancak, tüm bağlayıcı bayrak işini doğru yerde yaptığımdan bile emin değilim. Biraz daha ayrıntı çok yardımcı olur.
Şifreleme

peki hangi derleyiciyi kullanıyorsunuz? Mingw? gcc? hangi kodu çalıştırmaya çalışıyorsun? bir örnek ver .....
pyCthon

@pyCthon: Comiler Gcc'dir. Şimdiye kadar herhangi bir kod yazmadım, ancak Boost filesystem libraryyukarıdaki yazıya (operation.hpp)
eklemeyi

g ++ ile komut satırından dosya sistemi kitaplığını artıran normal bir programı derlemek işe yarıyor mu?
pyCthon

Yanıtlar:


141

libboost_systemKitaplığa bağlamalısınız . Kod bloklarından emin değilim, ancak platformunuzdaki g ++ komut satırı seçeneği

-lboost_system


Yine de eklenecek bağlayıcı bayrağını zaten buldum. Codeblocks'da çalıştırılamıyor.
Şifreleme

@Cipher, kod blokları tarafından yürütülen derleme ve bağlantı komutlarını edinebilir misiniz?
juanchopanza

@Cipher üzgünüm, pastebin işte engellendi. Daha sonra kontrol edebilirim ama birkaç saat sürecek.
juanchopanza

Sorun değil.
Gönderide

Cipher ile aynı sorunu yaşıyorum, sadece benim durumumda boost / asio.hpp ile uğraşıyorum. Derleyiciye çalışırken s1.directupload.net/images/130608/koyvqpdp.jpg bu hatayı alıyorum . -Lboost_system eklemeye çalıştığımda "lboost_system bulunamıyor" diyor. Sorun ne?
ddacot

21

Yükseltme sürümüne bağlı olarak libboost-system, kütüphanelerin çoklu okuma kapasitesini gösteren -mt sonekiyle birlikte gelir.

Yani -lboost_systembağlayıcı tarafından bulunamazsa deneyin -lboost_system-mt.


1
Çalışır çünkü bu yükseltme sürümleri için gerçek kitaplık dosyası adının bir -mtsoneki vardır.
tssch

9

Bu bir bağlayıcı sorun. Statik kitaplık yolunu projenize ekleyin.

Qt Creator için proje dosyasını açın .prove aşağıdaki satırı ekleyin:

LIBS += -L<path for boost libraries in the system> -lboost_system

Benim durumumda Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

Codeblock'lar için Settings->Compiler...->Linkerayarlar sekmesini açın ve şunları ekleyin:

boost_system

Bağlantı kitaplıkları metin widget'ına gidin ve düğmesine basın OK.


7

Ben de bir çözüm aradım ve karşılaştığım cevapların hiçbiri hatayı çözmedi, ta ki bu konuya "ViRuSTriNiTy" cevabını bulana kadar: 'boost :: system :: generic_category ()' için tanımlanmamış başvuru?

bu yanıta göre, şu satırları cmake dosyanıza eklemeyi deneyin:

find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
include_directories(... ${Boost_INCLUDE_DIRS})
link_directories(... ${Boost_LIBRARY_DIRS})
target_link_libraries(... ${Boost_LIBRARIES})

5

Bu cevap aslında Boost ve cmake kullanılırken yardımcı oldu.

Ekleme add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) cmake dosyası için.

CMakeLists.txt dosyam şöyle görünüyor:

cmake_minimum_required(VERSION 3.12)
project(proj)

set(CMAKE_CXX_STANDARD 17)


set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")

set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")

set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")


include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})

set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)

add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
        processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
        meta_command.h terminal/terminal.cpp terminal/terminal.h)


if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
endif()

4

İ g ++ derleyici bayrağı değiştirildi sonra çözülmüş, basit bir takviye örnek oluşturmaya Aynı sorun -std = C ++ 14 için -std = C ++ 11 .

Ve bunun bir C ++ 11 Örneği olduğunu fark ettim ...


Bu benim sorunumu çözdü. Derleme sırasında kullanılan bayrakları unutmak oldukça kolaydır, özellikle varsayılanları kullandığınızda.
Filipe Calasans

3

Aynı problemi yaşadım ve ayrıca Linux Mint (nuduoz olarak) kullanıyorum. İ ekledikten sonra benim dava sorun çözüldü boost_systemiçin GCC C++ Linker->Libraries.


1

Başka bir sorunla karşılaşabilirsiniz. Boost'u Linux Mint'e yükledikten sonra aynı sorunu yaşadım. Kitaplığın adı olduğu için bağlanıyor -lboost_systemveya -lboost_system-mtçalışmıyorlibboost_system.so.1.54.0 .

Dolayısıyla çözüm, orijinal dosyaya sembolik bağ oluşturmaktır. Benim durumumda

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

Daha fazla bilgi için bu soruya bakın .


1

Kütüphane kurulu değilse, boost libraries klasörü vermelisiniz:

misal:

g ++ -L / usr / lib / x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog


0

Deneyin

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ destek kütüphanesinin yeri

find /usr/ -name '*boost*.so'destek kütüphanesi konumunu bulmak için kullanın


0

g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

debian altında mükemmel çalıştı. (apt-get ile yüklenen c ++ kitaplıklarını artırın).


0

Yukarıda açıklanan önerilen çözümleri test ettikten sonra, yalnızca bu birkaç satırın işe yarayacağını buldum.

Ubuntu 16.04 kullanıyorum.

cmake_minimum_required (VERSION 3.13)
projesi (Projem)

set (CMAKE_CXX_STANDARD 11)
add_executable (projem main.cpp)

find_package (1.58.0 GEREKLİ BİLEŞENLER sistem dosya sistemini artırın)
target_link_libraries (Projem $ {Boost_LIBRARIES})

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.