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.