
Ubuntu日本語フォーラム

ログインしていません。
Linux初級者なので、アドバイス頂ければ幸いです。
以前、大学の研究室で使っていたUnixマシン(HPの32bitマシン)の計算プログラム(C言語、Ansi-C)を新しく購入したlinux(64bit)マシンで使いたいのですが、コンパイルはできているようなのですが、計算実効できません。Makefileは
####### Makefile #######
CC = cc
CFlags = -g #(← 元々は、CFlags = -Aa -g だったのですがコンパイルでerrorが発生、-Aaを消したらコンパイルが可能となった)
LD = cc
OBJ = main.o input.o
LIBS = -lm
PROGRAM = myprog
all: $(PROGRAM)
$(PROGRAM) : $(OBJS)
@echo "Linking $(PROGRAM) ..."
@$(LD) $(OBJS) $(LIBS) -o $(PROGRAM) ..."
@echo "done"
.c.o: $(CC) $(CFLAGS) -c -g $<
clean:; @rm -f
####################
これまでは、
$ make clean
$ make
cc -g -c -g main.c
cc -g -c -g input.c
Linking myprog ...
done
$ myprog
とコマンドを入れると計算が実行できたのですが、現在、$myprogを実行すると以下のエラーが生じます。
$ myprog
myprog: command not found
どこを修正すれば、計算実行となりますでしょうか?また、これ以外にも恐らく多くの修正をしないといけないと想像しています。何かしらの注意点や参考になる本やwebサイトがあれば紹介して頂ければありがたいです。尚、計算プログラムは、研究室にもともとあったプログラムを自分なりに上書き・修正して作ったものです。また、今後別の別のプログラムをLinuxに移行される予定であるため、修正箇所を知っておきたいと考えております。アドバイス頂ければ幸です。
オフライン
すみません、少しタイプミスがありましたので修正しました。
####### Makefile #######
CC = cc
CFLAGS = -g #(← 元々は、CFLAGS = -Aa -g だったのですがコンパイルでerrorが発生、-Aaを消したらコンパイルが可能となった)
LD = cc
OBJS = main.o input.o
LIBS = -lm
PROGRAM = myprog
all: $(PROGRAM)
$(PROGRAM) : $(OBJS)
@echo "Linking $(PROGRAM) ..."
@$(LD) $(OBJS) $(LIBS) -o $(PROGRAM)
@echo "done"
.c.o: $(CC) $(CFLAGS) -c -g $<
clean:; @rm -f $(OBJS)
####################
オフライン
エラーメッセージから判る直接の原因は、実行しようとしている時に、(そのファイルを探しに行ったディレクトリの中には)実行ファイルが見つからないのが原因です。
順に調べましょう。まず、実行ファイルが間違いなく作成されているかを確認してください。
ls -l myprog
生成しているmakefileをみながら悩むより、実際にファイルがあるか、無いかを確認した方が確実です。
# もし、makefileに問題があったとしても、ファイルの有無の結果を踏まえて、それを生成しているmakefileの動作を推測する と言うほうが楽です。
確認してみて、ファイルが無い場合は、コンパイル/リンクに失敗していますから、なんらかのエラーか警告が出ているはずです。こぴぺ等で書いていただくと、原因の推測に役に立つ・・・と思われます(どれがエラーなのかも判らなければ、makeを実行してから、コマンドプロンプトに戻るまで全部こぴぺすれば確実です。たぶん。)
次に、MS-WindowsとUnixの大きな違いとして、
・シェルにファイル名のみを指定して実行しようとした場合、そのファイルは、環境変数の「PATH」で指定されているディレクトリだけが対象となる。
というのがあります。言い換えると、
・環境変数の「PATH」に、カレントディレクトリ(今居るフォルダ)を表すものを明示的に書いて無いなら、カレントディレクトリも対象にはならない。
ということです。
そのため、上記の、ls -lにて、ファイルが生成されていることが確認できたら、実行する際には、
./myprog
のように、(ファイル名のみの指定ではなく)相対パスで指定するようにしてみてください。
# もちろん、相対パスではなく、絶対パスでも良いです。
※(注意)これを読むと、「それなら、環境変数「PATH」に、カレントディレクトリを追加すればよいのかな」(おそらく、以前の環境は利便性のためにこうなってきた)と思うかもしれませんが、セキュリティ上「やるべきではない」ということになります。また、完成した(安全な)実行ファイル以外のファイルが置かれる可能性のあるディレクトリ(=今、開発に使用しているディレクトリ)をPATHに追加することもお勧めしません(どう問題になる可能性があるかと言うと、「/tmp/ls」というシェルスクリプトを作成する話しとかありますね)
・・・と、書いてから気が付いたのですが、単にLinuxとしか掛かれてないんですが、Ubuntuの話しでよいんですよね?
オフライン
myprogがカレントディレクトリに有り、かつ、PATHがカレントディレクトリに通っていれば実行できますが、通っていなければ、カレントディレクトリは、検索されませんので、”./myprog”として、カレントディレクトリに有ることを明記しなければいけません。
これは、HP-UXも同じだと思いますが、カレントディレクトリをPATH指定しているのでしょうか?
HP C の -Aa は、ansiモード指定だそうです。
gcc なら -ansi でしょうか?
オフライン
weykさん
なるほど。。。チェックしたところ、myprogは、存在し、「./myprog」で実行すると、計算できました。どうも丁寧にアドバイスを頂き有難うございました。ちなみに、ディストリブーションは、ubuntu10.04がです。カレントディレクトリのPATHは、きっておらず、今後もそうしないようにしてみます。
slさん
どうも有難うございました。上記のとおり無事実行できました。なんか、たくさん勉強になります。
オフライン