Estou tentando compilar um programa no Ubuntu 11.10 que usa as bibliotecas Boost. Eu tenho as bibliotecas 1.46-dev Boost do repositório do Ubuntu instaladas, mas recebo um erro ao compilar o programa.
undefined reference to boost::system::system_category()
O que é que eu faço de errado?
Respostas:
A biblioteca boost que você está usando depende da biblioteca boost_system. (Nem todos eles fazem.)
Assumindo que você usa gcc, tente adicionar
-lboost_system
à linha de comando do compilador para vincular a essa biblioteca.fonte
-lboost_system
, por isso ficou assim:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. Mas não ajudou ...autoreconf
depois? Além disso, este post e este podem ajudá-lo com a configuração das ferramentas automáticas.sslsniff_LDFLAGS
comsslsniff_LDADD
no Makefile.am e que não funcionou. Então eu mantive ambossslsniff_LDFLAGS
e acrescenteisslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Então eu fui capaz de compilar. Obrigado pela ajuda!Vincular a uma biblioteca que define o símbolo ausente (
-lboost_system
) é a solução óbvia, mas no caso particular de Boost.System, uma característica incorreta no design original o torna útilboost::system::generic_category()
eboost::system::system_category()
desnecessário. Compilar com o sinalizador-DBOOST_SYSTEM_NO_DEPRECATED
desativa esse código e permite que vários programas sejam compilados sem exigir-lboost_system
(esse link, é claro, ainda é necessário se você usar explicitamente alguns dos recursos da biblioteca).A partir do Boost 1.66 e deste commit , esse comportamento agora é o padrão, então esperamos que cada vez menos usuários precisem desta resposta.
Como notado por @AndrewMarshall, uma alternativa é definir o
BOOST_ERROR_CODE_HEADER_ONLY
que habilita uma versão apenas de cabeçalho do código. Isso foi desencorajado pelo Boost, pois pode quebrar algumas funcionalidades. No entanto, desde 1.69, apenas o cabeçalho parece ter se tornado o padrão , supostamente tornando esta questão obsoleta.fonte
BOOST_ERROR_CODE_HEADER_ONLY
.Outra solução alternativa para aqueles que não precisam de toda a coisa: use o switch
-DBOOST_ERROR_CODE_HEADER_ONLY
.Se você usar o CMake, é
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.fonte
O erro acima é um erro do vinculador ... o vinculador um programa que pega um ou mais objetos gerados por um compilador e os combina em um único programa executável.
Você deve adicionar
-lboost_system
sinalizadores de vinculador que indicam ao vinculador que ele deve procurar por símbolos comoboost::system::system_category()
na bibliotecalibboost_system.so
.Se você tiver main.cpp:
OU
fonte
Ao usar CMAKE e find_package, certifique-se de que seja:
e não
Algumas pessoas podem ter perdido horas por isso ...
fonte
Eu tenho o mesmo problema:
A solução foi usar a versão de depuração do lib do sistema:
Mas por que?
fonte
Quando tive esse problema, a causa foi o pedido das bibliotecas. Para consertar, coloquei por
libboost_system
último:Isso foi no mingw com gcc 5.3 e boost 1.61.0 com um exemplo de timer simples.
fonte
no meu caso, adicionar
-lboost_system
não foi suficiente, ainda não foi possível encontrá-lo em meu ambiente de compilação personalizado. Tive que usar o conselho em Livrar-se de "gcc - / usr / bin / ld: aviso lib não encontrado" e alterar meu./configure
comando para:para obter mais detalhes, consulte Boost 1.51: "erro: não foi possível vincular ao boost_thread!"
fonte
... e caso você queira vincular seu principal estaticamente, em seu Jamfile adicione o seguinte aos requisitos:
e talvez também:
fonte