Erro: "strlen" não foi declarado neste escopo

1

Estou tentando compilar vários softwares de terceiros a partir do código-fonte (ou seja, zchaff , argosat ) e erros como:

Error: ‘strlen’ was not declared in this scope
Error: ‘strcmp’ was not declared in this scope

Aqui está o texto completo da mensagem de erro (também no Ubuntu Pastebin ):

erelsgl@erel-biu:~/Dropbox/theorem-prover/argosat-1.0$ make
make  all-recursive
make[1]: Entering directory '/home/erelsgl/Dropbox/theorem-prover/argosat-1.0'
Making all in src
make[2]: Entering directory '/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src'
Making all in strategies
make[3]: Entering directory '/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src/strategies'
/bin/bash ../../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I../.. -I../../src -I../../src/auxiliary -I../../src/basic-types   -ffloat-store -Wall -Woverloaded-virtual -ansi -pedantic -Wno-strict-aliasing -DNDEBUG -O3 -MT libstrategies_la-RestartStrategy.lo -MD -MP -MF .deps/libstrategies_la-RestartStrategy.Tpo -c -o libstrategies_la-RestartStrategy.lo 'test -f 'RestartStrategy.cpp' || echo './''RestartStrategy.cpp
 g++ -DHAVE_CONFIG_H -I. -I../.. -I../../src -I../../src/auxiliary -I../../src/basic-types -ffloat-store -Wall -Woverloaded-virtual -ansi -pedantic -Wno-strict-aliasing -DNDEBUG -O3 -MT libstrategies_la-RestartStrategy.lo -MD -MP -MF .deps/libstrategies_la-RestartStrategy.Tpo -c RestartStrategy.cpp -o libstrategies_la-RestartStrategy.o
In file included from ../../src/SolverListener.hpp:22:0,
                 from RestartStrategyConflictCounting.hpp:24,
                 from RestartStrategyMinisat.hpp:22,
                 from RestartStrategy.cpp:22:
../../src/basic-types/Literal.hpp: In static member function ‘static void ArgoSat::Literals::shuffleVector(std::vector<unsigned int>&)’:
../../src/basic-types/Literal.hpp:83:23: error: ‘rand’ was not declared in this scope
RestartStrategy.cpp: In static member function ‘static ArgoSat::RestartStrategy* ArgoSat::RestartStrategy::createFromCmdLine(ArgoSat::Solver&, int, char**, int)’:
RestartStrategy.cpp:33:40: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:35:37: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:37:37: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:39:34: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:41:36: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:43:41: error: ‘strcmp’ was not declared in this scope
make[3]: *** [libstrategies_la-RestartStrategy.lo] Error 1
make[3]: Leaving directory '/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src/strategies'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory '/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/erelsgl/Dropbox/theorem-prover/argosat-1.0'
make: *** [all] Error 2
erelsgl@erel-biu:~/Dropbox/theorem-prover/argosat-1.0$

Encontrei outras perguntas, como link , que esses erros podem ser resolvidos inserindo instruções "include" no código-fonte.

Mas, eu baixei o código-fonte de outros sites e tenho certeza que funciona para eles como está. Então, por que isso não funciona para mim?

(Eu tenho o Ubuntu 12.04.4, g ++ 4.6.3)

    
por Erel Segal-Halevi 19.01.2014 / 10:50

1 resposta

1

Este parece ser o resultado de um bug no código-fonte do programa (pelo menos no caso específico em que você forneceu detalhes). Mas felizmente é uma que você pode trabalhar sem muito problema!

Como este é um problema recorrente e acontece frequentemente quando o código-fonte de um programa testado em outra plataforma (mais frequentemente Windows) é trazido para o Ubuntu, provavelmente devemos considerar essa questão no tópico, embora envolva erros e programação. Com isso dito, reportar o bug para o desenvolvedor do programa é uma ação apropriada também.

Parece que uma das seguintes situações se aplica:

  1. Na (s) plataforma (s) onde o programa foi desenvolvido e testado, o (s) arquivo (s) de cabeçalho que fornecem identificadores como strlen foram indiretamente incluídos sendo puxados pela implementação de algum outro arquivo de cabeçalho . Isto é involuntariamente comportamento específico da implementação.
  2. Algumas implementações estranhas da biblioteca padrão C ++ permitem muitas coisas que são tecnicamente proibidas e algumas coisas que são conceitualmente impossíveis. (Isso não os torna ruins no geral, necessariamente.) Acredito que algumas versões da biblioteca C ++ da Microsoft oferecem a você funções como strlen como identificadores globais mesmo do C ++ em estilo #include s como #include <cstring> . Isso não funcionará com o GCC / g ++ no Ubuntu.

Em ambos os casos, você provavelmente terá que editar um pouco o código-fonte, como ponteiro nulo sugerido . Como isso é bastante simples, podemos orientá-lo através deste se você nos informar exatamente quais arquivos você baixou e quais etapas você tomou antes de executar make . Você pode editar sua pergunta para incluir esta informação também.

O conselho do ponteiro nulo para adicionar algo como #include <string.h> no topo dos arquivos onde os erros estão ocorrendo provavelmente funcionará. Pode ou não ser a melhor maneira de corrigir isso. Se a situação 2 for o que está acontecendo, uma instrução using para as palavras-chave necessárias (ou o namespace std inteiro, se necessário) seria suficiente.

    
por Eliah Kagan 19.01.2014 / 12:46