C ++ Boost: referência indefinida para boost :: system :: generic_category ()


92

Estou tentando incluir Boostbibliotecas no meu projeto e tenho enfrentado problemas no mesmo. Estou no Ubuntu 12.10 com Codeblocks IDE e tentei instalar as bibliotecas manualmente lendo as instruções do site, mas estava obtendo erros com o cabeçalho, bem como com as bibliotecas a serem construídas antes de usar.

Em seguida, instalei as bibliotecas via terminalby sudo apt-get install libboost-all-dev. Depois disso, em meus programas em Codeblocks, posso incluir cabeçalhos como, #include <boost/regex.hpp>mas quando tento incluir o cabeçalho para a biblioteca Filesystem ( #include "boost/filesystem/operations.hpp" ), recebo o seguinte erro:

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

Não tenho certeza de como resolver esse erro (especificamente no Codeblocks no Linux). Eu realmente poderia usar alguma ajuda aqui.

Compilador: Código do
programa Gcc : Tentei apenas incluindo o arquivo do sistema de arquivos acima operations.hpp.

Criar log de Codeblocks:

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

você não está vinculando corretamente, os codeblocks não farão isso por você, ao contrário do caminho e do repositório do sistema,
— pyCthon

@pyCthon: Nesse caso, você pode adicionar mais detalhes mais detalhes sobre como vincular isso em Code :: blocks. Tentei adicionar o sinalizador do vinculador -lboost_systemem algum lugar das configurações, mas não funcionou. No entanto, não tenho certeza se fiz toda a coisa do sinalizador do linker no lugar certo. Um pouco mais de detalhes seria de grande ajuda.
— Cifra de

bem, qual compilador você está usando? mingw? gcc? qual código você está tentando executar? dê um exemplo ...
— pyCthon

@pyCthon: Comiler é Gcc. Eu não escrevi nenhum código até agora, mas tentei incluir o Boost filesystem library(operation.hpp no ​​post acima)
— Cipher

funciona compilando um programa regular com a biblioteca de sistema de arquivos boost da linha de comando com g ++?
— pyCthon

Respostas:


142

Você deve ligar na libboost_systembiblioteca. Não tenho certeza sobre os codeblocks, mas a opção de linha de comando g ++ em sua plataforma seria

-lboost_system


Já encontrei o sinalizador de vinculador a ser adicionado. Não consigo fazer funcionar no Codeblocks.
— Cifra de

@Cipher você pode obter os comandos de compilação e link executados por codeblocks?
— juanchopanza

@Cipher, desculpe, pastebin está bloqueado no trabalho. Posso verificar mais tarde, mas demorará algumas horas.
— juanchopanza de

Sem problemas. Atualizado na postagem também
— Cipher

Eu tenho o mesmo problema do Cipher, mas no meu caso eu lido com boost / asio.hpp. Recebo esses erros s1.directupload.net/images/130608/koyvqpdp.jpg ao tentar compilar . Quando tento adicionar -lboost_system, ele diz "não foi possível encontrar lboost_system". Qual é o problema?
— ddacot

21

Dependendo da versão do boost, libboost-system vem com o sufixo -mt que deve indicar a capacidade de multithreading das bibliotecas.

Portanto, se -lboost_systemnão puder ser encontrado pelo vinculador, tente -lboost_system-mt.


1
Funciona porque para essas versões boost, o nome do arquivo de biblioteca real tinha um -mtsufixo.
— tssch

9

É um problema de vinculador. Inclua o caminho da biblioteca estática em seu projeto.

Para o Qt Creator, abra o arquivo do projeto .proe adicione a seguinte linha:

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

No meu caso Ubuntu x86_64:

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

Para Codeblocks, abra a Settings->Compiler...->Linkerguia de configurações e adicione:

boost_system

ao widget de texto Bibliotecas de links e pressione o OKbotão.


7

Também procurei por uma solução e nenhuma das respostas que encontrei resolveu o erro, até que encontrei a resposta de "ViRuSTriNiTy" para este tópico: Referência indefinida para 'boost :: system :: generic_category ()'?

de acordo com essa resposta, tente adicionar estas linhas ao seu arquivo cmake:

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

Essa resposta realmente ajudou ao usar Boost e cmake.

Adicionando add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)para o arquivo cmake.

Meu CMakeLists.txt tem a seguinte aparência:

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

O mesmo problema na construção de um exemplo de boost simples, resolvido após eu alterar o sinalizador do compilador g ++ de -std = c ++ 14 para -std = c ++ 11 .

E percebi que é um exemplo C ++ 11 ...


Isso resolveu meu problema. É muito fácil esquecer os sinalizadores usados ​​durante a compilação, especialmente quando você usa os padrões.
— Filipe Calasans

3

Tive o mesmo problema e também uso Linux Mint (como nuduoz). Meu problema de caso foi resolvido depois de adicionar boost_systemao GCC C++ Linker->Libraries.


1

Você pode encontrar outro problema. Depois de instalar o Boost no Linux Mint, tive o mesmo problema. A vinculação -lboost_systemou -lboost_system-mtnão funcionou porque a biblioteca teve nome libboost_system.so.1.54.0.

Portanto, a solução é criar um link simbólico para o arquivo original. No meu caso

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

Para mais informações veja esta questão.


1

Se a biblioteca não estiver instalada, você deve dar uma pasta boost nas bibliotecas:

exemplo:

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


0

experimentar

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

/usr/lib/x86_64-linux-gnu/ é a localização da biblioteca boost

use find /usr/ -name '*boost*.so'para encontrar a localização da biblioteca de impulso


0

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

funcionou perfeitamente no debian. (impulsionar bibliotecas c ++ instaladas com apt-get).


0

Depois de testar as soluções propostas descritas acima, descobri que apenas algumas linhas funcionariam.

Estou usando o Ubuntu 16.04.

projeto cmake_minimum_required (VERSÃO 3.13)
(meuProjeto)

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

find_package (Boost 1.58.0 COMPONENTES REQUERIDOS sistema de arquivos)
target_link_libraries (myProject $ {Boost_LIBRARIES})

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.