トップページ⇒prog
4コメント3KB

gccでyacc/lexソースをコンパイル -> エラー

■ このスレッドは過去ログ倉庫に格納されています
0001C-manNGNG
Linuxで
gcc hoge_main.c lex.yy.c y.tab.c -ly -ll -o HOGE
というふうにコンパイルをすると、
ld:not found -ly
(今、近くにLinuxマシンないんで、記憶を頼りにかいたので
細かいところでは違う記述かもしれません。)
というエラーがでてしまいます。順番をかえて、-ll -ly
とすると、こんどは、
ld:not found -ll
とでます。
同じプログラムでも、Solaris
では動きました。

何がおかしいのでしょうか?(まさか、linuxのgccはyacc/lex関連
のソースはコンパイルできない、なんてことはあるのでしょうか?)

もしお詳しい方がいらしゃったら教えて下さい。
0002てきとーNGNG
空のディレクトリを作って、
下に書いたソースを"x.y"というファイルで保存して、
"$ make x"と叩いてごらん。makefileは書かなくていいです。
なお、これは'a'以外の文字を含む入力をすべてエラーにする
解析器です。

--ここから--
%{
int yyerror(const char *s);
%}

%%
all: all line | line
;

line: AREP '\n'
{ printf("OK\n"); }

line: '\n'
{ printf("OK(EMPTY)\n"); }

AREP: AREP 'a' | 'a'
;

%%
#include <stdio.h>
int yylex() {
return getchar();
}
int main() {
yyparse();
}
int yyerror(const char *s) {
printf("%s\n"@` s);
}
--ここまで--
[参考]コンパイルの過程
yacc x.y
mv -f y.tab.c x.c
cc -c x.c -o x.o
cc x.o -o x
rm x.o x.c
0003てきとーNGNG
お次は"y.l"で'$ make "LDFLAGS=-lfl" y'だな。
これは小文字の入力を全部大文字に変換して出力する。

%{
#define yywrap() 1
%}
%%
[a-z] { printf("%c"@`toupper(*yytext));}
. { printf("%c"@` *yytext);}
%%
0004おれもてきとーNGNG
Linuxにはliby.a@`libl.aはないみたい.lexについては替わりに
libfl.aがあります.ですから-llの替わりに-lflにしてみましょう.
flexについてはmanを参照して下さい.

あとliby.aの中身というのはmainとyyerror関数です.ですからこれら
の関数を自分で定義しておけば,-lyは必要ないです.面倒臭いと思う
なら,自分で適当にliby.aを作ってしまいましょう.

main()
{
exit(yyparse());
}

yyerror(char *s)
{
fprintf(stderr@` "%s\n"@` s);
}

とか書いとけば十分でしょう.でも普通これらの関数は自分で定義するの
で必要ないといえば必要ないですね..
■ このスレッドは過去ログ倉庫に格納されています