入社して一年目の未熟者なので教えてください
Cのコンパイル時のオブジェクトのファイルサイズが毎回違っているのですけど(ソースは同じもの)どうしてですか?
同じになる時もあります。
環境はSolarisです。
よろしくお願いしま~す
⊂((〃'人'〃))⊃オ・ネ・ガ・イ・ウキャ♪

A 回答 (2件)

ソフトウェアによっては、makeを実行するごとにコンパイル回数を


カウントして、ソース中の文字列を変更しているものもあります。
その場合、文字列の共有とかの都合でサイズが変わることもあり得
るでしょう。

コンパイル途中にライブラリを作っていて、2回目以降のコンパイ
ルではそのライブラリを作り直さずにモジュールの上書きだけとい
う場合には、モジュールのアドレスが変わるなどして変化がある可
能性もあります。

他にも、サイズが変わる可能性としては、2回目以降で以前のコン
パイル結果の何かを利用しているということでしょうね。しかし、
2回目と3回目でも変化があるのは、あまり思いつきません。

いずれにしても、原因をちゃんと調べたいなら、1回だけコンパイ
ルしたディレクトリ、2回だけ、3回だけ、4回だけと別々に用意し、
diff -ru dir1 dir2 とかして、一方にしかないファイル、変化の
あるファイルの有無をチェックすればいいかと思います。

単なる興味なのですが、もし調べられたら、補足ででも紹介しても
らえるとありがたいです。
    • good
    • 0

ソースコードが同じでもコンパイルオプションが


異なれば当然オブジェクトファイルのサイズも
変わります。
たとえば、「-O2」をつけるかどうかでもファイル
サイズは変わりますし、「-g」がつけばファイル
サイズが大きくなります。

また、最終的な実行ファイルもリンクするライブラリに
よってファイルサイズが変わります。

この回答への補足

ご回答ありがとうございます
質問が中途半端だったので申し訳ありませんが、
コンパイルするmakefileは同じものをつかっているので、オプション等の条件は毎回同じです。
例えば続けて数回同じものをコンパイルした際、サイズが変わってしまいます。
どうしてなんですか?最適化とか関係有るのでしょうか?
わかれば教えてください。(。-人-。) スイマセン
サイズ例・1回目:807312バイト ・2回目:807308バイト 
    ・3回目:807304バイト ・4回目:807304バイト・・・・・

補足日時:2001/06/26 12:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCのソースを毎回コンパイルしないと実行結果が見れないのが不便で・・・

こんにちは。C言語の勉強をしている初心者です。windowsXPでgcc-2.95を使っています。

ソースファイルをメモ帳で作ってから、コマンドプロンプトで入って、gcc sample.c -o sample のようにしてコンパイル?してから、実行ファイルのsampleができて、コマンドラインでsampleと入力して実行結果を確認しています。

でも、勉強中の身なので

printf("Hello\n");
の部分を
printf("Hello");とか
printf("%d", 3);とか
printf("%s", "Hello");とか
ちょっとずつ書き変えて実行結果がどうなるのかを身ながら学習しています。

ソースファイルの一部分を書き換えて結果を比較したいだけなのに、メモ帳を開いて編集して、またコマンドラインからコンパイル?をして、実行ファイル名で実行という作業を何回も繰り返すので手間がかかって不便だな・・・と感じます。

もっと便利な環境ってないのでしょうか。ソースを書いている状況のままで、試しにプログラムを実行させて結果を比べながら作業できる環境ってないのでしょうか。

この説明で理解してもらえるか不安ですが、ご存知の方教えていただけませんか?

こんにちは。C言語の勉強をしている初心者です。windowsXPでgcc-2.95を使っています。

ソースファイルをメモ帳で作ってから、コマンドプロンプトで入って、gcc sample.c -o sample のようにしてコンパイル?してから、実行ファイルのsampleができて、コマンドラインでsampleと入力して実行結果を確認しています。

でも、勉強中の身なので

printf("Hello\n");
の部分を
printf("Hello");とか
printf("%d", 3);とか
printf("%s", "Hello");とか
ちょっとずつ書き変えて実行結果がどうなるのかを身な...続きを読む

Aベストアンサー

>初心者に高級すぎるツール?
初心者こそ、こういう補助機能の充実したIDEを使うべき。
上級者になれば補助機能は無くても平気なのでメモ帳で書いてgccでビルドでもやれますけど、上級者はそんな非効率な事はよっぽどの事情が無ければやりませんね。

VC++2008EEでC言語のコンソールアプリを作るやり方の簡単な解説
http://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tool/vsee2008/vsee2008.html

ツールを使いこなす事が主目的ではない筈なので本当の目的を見失わないようにね。

QSolarisのプログラムをWindows環境でコンパイル

Solaris環境でコンパイルを指定された、c言語で書かれたプログラムを
Windows環境でコンパイル・実行するにはどうしたらよろしいでしょうか?
仮想マシン以外でありましたらよろしくお願いします。

makefile
CC = gcc -g

all: s

s : s.o t.o
s.o : s.c t.h
t.o : t.c t.h

clean:
-rm s *.o out? core*

Aベストアンサー

WindowsにCygwinをインストールするという方法もあります。
ただし、MinGWにしてもCygwinにしても、Solaris固有の機能を使っているプログラムには対応できません。プログラムを一部書き換えれば対応できる場合もありますし、根本的に設計から見直さなければいけない場合もあります。

参考URL:http://ja.wikipedia.org/wiki/MinGW, http://ja.wikipedia.org/wiki/Cygwin

QCソースのコンパイルのワーニングについて

C初心者です。
お願いします。

Cソースをコンパイルしたのですが、ワーニングがでて、どうすればいいのか手も足もでません…
詳しい方ご教授ねがいます。

ワーニング内容
warning #4232-D:conversion from "DATA_T *" to a more strictly aligned type "DATA_BYTE *" may cause misaligned access
sizeof(DATA_T),(DATA_BYTE *)data_t

型の定義に関してだと思うのですが、どうしていいかわかりません…
キャストがうまくいってないような…

変数の定義は以下です。
typedef unsigned char DATA_BYTE_U
typedef DATA_BYTE_U * DATA_BYTE

typedef sutruct{
char head
char dat
char tail
}DATA_T

DATA_T *data_t

OSはUNIXです。
情報が足りなければ教えてください。

よろしくお願いします。

C初心者です。
お願いします。

Cソースをコンパイルしたのですが、ワーニングがでて、どうすればいいのか手も足もでません…
詳しい方ご教授ねがいます。

ワーニング内容
warning #4232-D:conversion from "DATA_T *" to a more strictly aligned type "DATA_BYTE *" may cause misaligned access
sizeof(DATA_T),(DATA_BYTE *)data_t

型の定義に関してだと思うのですが、どうしていいかわかりません…
キャストがうまくいってないような…

変数の定義は以下です。
typedef unsigned char DATA_BYT...続きを読む

Aベストアンサー

翻訳すると、

DATA_T へのポインタを(キャスト使って)DATA_BYTE
へのポインタに変換しようとしてますけど、DATA_T
のほうが、DATA_BYTE よりサイズが大きいから、たぶ
ん、良くないことが起こりますよ。

です。

ポインタというのは、単なる「アドレス」ではなく
て、ポインタ(指し示すもの)です。
ですから、「なにを」ポイントするのかも一致させる
必要があります。

また、こういうソースの通例として、おそらくは、

typedef sutruct{
char *head
char *dat
char *tail
}DATA_T;

が正解でしょう。

それぞれのメンバーをアクセスするのであれば、

data_t->head;
data_t->dat;
data_t->tail;

でアクセス可能ですし、もしも、本当にポインタ経由で
アクセスする必要があるのなら、

DATA_BYTE_U ptr = data_t->head;

などで、ptr 経由でアクセスできます。

typedef unsigned char DATA_BYTE_U;
typedef DATA_BYTE_U * DATA_BYTE;

が正しいのなら。

翻訳すると、

DATA_T へのポインタを(キャスト使って)DATA_BYTE
へのポインタに変換しようとしてますけど、DATA_T
のほうが、DATA_BYTE よりサイズが大きいから、たぶ
ん、良くないことが起こりますよ。

です。

ポインタというのは、単なる「アドレス」ではなく
て、ポインタ(指し示すもの)です。
ですから、「なにを」ポイントするのかも一致させる
必要があります。

また、こういうソースの通例として、おそらくは、

typedef sutruct{
char *head
char *dat
char *tail
}DATA_T;
...続きを読む

QwindowsでLinuxで作成したソースをコンパイル

Linuxで作成、
$gcc -Wall file.c
で、通ったファイルをWindowsでも同様に通したいので、MinGWを使って、コンパイルしたのですが、
#include <sys/socket.h>
の構文で引っかかってしまいました。どうやらインクルードファイルが無いようでしたので、
C:\MinGW\include
C:\MinGW\lib
以下に、Linuxの
/usr/include/
/usr/lib/
以下のファイルをそのまま入れて、再度実行しました。

ヘッダーファイルは見つけて読んでくれたのですが、そのヘッダーファイルに書いてある関数(例:htons(), socket(), inet_addr(), connect())が参照できないとの事で、怒られてしまいます。

Linuxのライブラリファイルをそのまま入れたのがまずかったのかもしれないのですが、こいつのエラーを解消する有効手段が見つかりません。

問題解決のヒント、又は答えを教えていただけませんでしょうか。
どうか、お願い致します。

Aベストアンサー

Unix と Windows ネイティブな環境では基本的にヘッダファイルやライブラリの構造が、基本骨格 (いわゆる、stdio.h や stdlib.h などに含まれている関数) を除いては大きく異なっているので、Unix でコンパイルできたプログラムが必ずしも Windows でコンパイルし、実行できるわけではありません。(もちろん、その逆も当てはまります)

MinGW は Windows ネイティブな実行プログラムを作成するものなので、MinGW でコンパイルする場合はちゃんと Windows 用のプログラムとして書かなければなりません (#2の方が書かれているように、socket.h ではなく、winsock2.h を使用するなど)。もし、Unix にのみ対応したプログラムを Windows 上で動かしたいと言うことであれば、Cygwin (要するに Unix 関数の処理を Windows ネイティブな処理に変換するエミュレータ) を利用する必要があります。

QC言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると

C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。

#include <stdio.h>
#include <stdlib.h>

int main(void){
int x;
x = rand();
printf("%d",x);
return 0;
}

使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。

Aベストアンサー

コンピュータが出す「乱数」は正確には「疑似乱数」と呼ばれるもので、一見ばらばらの数値に見えますが、実際は一定の法則で計算して出した値です。
疑似乱数には「種」と呼ばれる初期値があって、この種から乱数を発生→その乱数を元に次の種を作る→その種を元に次の乱数を発生→....というようにしていきます。
計算式は一定なので、種が同じなら、同じ乱数が同じ順番で出てきます。

さて、あなたのプログラムですが、種を設定するsrand関数を使っていません。
Cのrand関数では、srandで設定しない場合、種として特定の値が使われます。
種が特定の同じ値なので、それから発生させた乱数も同じ乱数列になります。

種はsrand関数を使って設定します。
常套手段としては、time関数を使って現在時刻(を表す値)を種にするものです。

参考URL:http://www001.upp.so-net.ne.jp/isaku/rand.html


人気Q&Aランキング

おすすめ情報