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
Cifra
fonte
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

Juanchopanza
fonte
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.

tssch
fonte
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.

GLR
fonte
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})
SubMachine
fonte
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()
sdd
fonte
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 ...

Halowb
fonte
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.

piotr93
fonte
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.

Nuduoz
fonte
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

Majukarma
fonte
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

algometrix
fonte
0

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

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

majukarma
fonte
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})

Alan Yang
fonte