Pobrałem kod źródłowy i chciałem skompilować plik skanera. Generuje ten błąd:
[meepo@localhost cs143-pp1]$ gcc -o lex.yy.o lex.yy.c -ll
In file included from scanner.l:15:0:
scanner.h:59:5: error: unknown type name ‘bool’
In file included from scanner.l:16:0:
utility.h:64:38: error: unknown type name ‘bool’
utility.h:74:1: error: unknown type name ‘bool’
In file included from scanner.l:17:0:
errors.h:16:18: fatal error: string: No such file or directory
compilation terminated.
Próbowałem użyć innego narzędzia do kompilacji, ale pojawiły się różne błędy.
[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status
Mój system operacyjny to 3.0-ARCH, nie wiem, dlaczego tak się stało. Jak naprawić błąd?
#include <stdbool.h>
Odpowiedzi:
C90 nie obsługuje logicznego typu danych.
C99 zawiera to w tym:
#include <stdbool.h>
źródło
#include <stdbool.h>
._Bool
.<stdbool.h>
Nagłówek zapewnia typedef za to nazwiebool
, wraz ztrue
afalse
.gcc
skompilowany plik stbool.h . Jednak wydaje się, że C ++ zna wartości logiczne „po wyjęciu z pudełka”, więc mógłbym po prostu użyć gog++
do kompilacji bez żadnych zmian w kodzie. Więc w zależności od kontekstu, źródła kodu i dalszych błędów, być może nie patrzysz na kod C, ale C ++.C99 tak, jeśli masz
#include <stdbool.h>
Jeśli kompilator nie obsługuje C99, możesz to zdefiniować samodzielnie:
// file : myboolean.h #ifndef MYBOOLEAN_H #define MYBOOLEAN_H #define false 0 #define true 1 typedef int bool; // or #define bool int #endif
(ale należy pamiętać, że ta definicja zmienia ABI dla
bool
typu, więc łączenie z zewnętrznymi bibliotekami, które zostały skompilowane z odpowiednio zdefiniowanymi,bool
może spowodować trudne do zdiagnozowania błędy w czasie wykonywania).źródło
bool
jest:typedef enum { false, true } bool;
typedef
mieć możliwość odniesienia się do typu jakobool
zamiastenum bool
.long FLAG = 0x4000000; bool b = ( x & FLAG );
to powoduje niezdefiniowane zachowanie (z prawdopodobnym wynikiem, któryb
będzie wyglądał na fałsz, nawet jeślix
ustawiono flagę). Trudniej to zauważyć, gdybool
jest to parametr funkcji. Używaj, ale używaj ostrożnie.typedef
będzie to zachowywało się tak samo, jak prawdziwy bool C99 w przypadkach skrajnych, zarówno dlatego, że prawdziwy bool C99 ma tylko dwie wartości, aletypedef
obsługuje tak wiele, jakint
robi, ale także dlatego, że C99bool
ma specjalne reguły rzutowania, którychtypedef
nie ma. Przykład: w C99(bool)99999998430674944
jest jednoznacznietrue
. Z twojątypedef
kompilacją w GCC na moim komputerze(bool)99999998430674944
jestfalse
(ze względu na sposób obsługi przepełnienia podczas rzutowania).Po prostu dodaj następujące informacje:
#define __USE_C99_MATH #include <stdbool.h>
źródło
__USE_C99_MATH
?Gdzieś w twoim kodzie jest linia
#include <string>
. To samo w sobie mówi, że program jest napisany w C ++. Więc używanieg++
jest lepsze niżgcc
.W przypadku brakującej biblioteki: powinieneś rozejrzeć się po systemie plików, czy możesz znaleźć plik o nazwie
libl.so
. Użyjlocate
polecenia, spróbuj/usr/lib
,/usr/local/lib
,/opt/flex/lib
lub użyj brute-forcefind / | grep /libl
.Po znalezieniu pliku musisz dodać katalog do wiersza poleceń kompilatora, na przykład:
źródło