コンパイラ・プラットフォームの依存関係

解決


DD.  2005-09-16 21:10:56  No: 59052

DD.でございます。
前回からあまり日があいていない投稿ですが申し訳ありません。

タイトルの件、現在VC++2005 Beta にて作成したプログラムを
別PCにて稼動確認を行っております。

OSはいずれもXPです。

このプログラムを別PCで起動したところ"不正なプログラム"と、
ダイアログエラーがでて終了してしまいます。

プログラムはコンソールベースでまったく同じソースを
BCCにてコンパイルすると正常に別PCでも稼動します。

コンパイラ・プラットフォーム環境の違いによる
プログラムの設計に慣れておらず
原因がつかめておりません。

皆さんならばこういう場合にどのような疑問をもたれるのでしょうか?
教えて頂ければと思います。

また"別PC"にはVC++2005・BCC・Platform SDKのいずれも入れておりません。
Platform SDKの問題かと思いインストールしようとしたのですが
永遠と "Retry" となりインストールはできませんでした。。。

よろしくお願い致します。


Toshi  2005-09-30 20:23:44  No: 59053

一番考えやすいのは、「不正な処理」で落ちるのが「正解」だと言うことです。
つまり、そのプログラムは元々バグを抱えていて、
開発マシンのメモリ構成だとだと「運良く」動いている・・
BCCでコンパイルすると、バグを少し隠蔽してくれる・・・
みたいな感じじゃ無いでしょうか・・


ひでらん  2005-10-05 00:27:05  No: 59054

.NET FrameworkのBeta2が入ってないから動かない
という事は・・・。
コンソールのプロジェクトは2種類作成出来ますよね?
どう違うかわかりませんが・・・。


DD.  2005-10-05 01:48:07  No: 59055

Toshiさんひでらんさん回答ありがとうございます。

間が空いての返信でしたので全然気づいてませんでした。
申し訳ありません。

>一番考えやすいのは、「不正な処理」で落ちるのが
>「正解」だと言うことです。
なるほど。一応、main()内を空にしてコンパイルを行い、
上記作業を再度施しましたが結果は同じでした。
(他ソースのリンクは行っています)

また、一つのプログラムに関わらず、他プログラム全てで起きてしまいます。

ですので、環境依存の問題かと判断致しました。

>.NET FrameworkのBeta2が入ってないから動かない
>という事は・・・。
.NET Framework SDKも"別PC"には入れてありません。
.NETに依存するようなプログラムは組んでいないのですが
VC++2005でコンパイルしたexeを実行するにあたっては
コードに関わらず必要なんでしょうか?
ちょっと試してみます。

お二方、ありがとうございました。

エラーの詳しい詳細:
「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」

#何をインストールするんだか。。。orz


Toshi  2005-10-05 04:40:09  No: 59056

なるほど、コンソールアプリケーションでもって、空の main(){} だけでも動いてくれないって事ですね?
って事は開発マシンのコンパイラ環境が致命的な設定になっているとしか考えられないと思います。
例えば、開発マシンは 64bit環境で64bitコードを作ってるとか・・・
じゃなかったら、ターゲットCPUが違うとか・・・


DD.  2005-10-05 06:32:45  No: 59057

>なるほど、コンソールアプリケーションでもって、空の main(){} だけでも>動いてくれないって事ですね?
その通りです。

>例えば、開発マシンは 64bit環境で64bitコードを作ってるとか・・・
現在使用しているPCは全て32bit環境でコンパイルをかけたPCも32bitです。
ですがそれでは問題なく動いているということは恐らく大丈夫かと思うのですが。。。
#まだここらへん詳しくないのでなんとも^^;

>じゃなかったら、ターゲットCPUが違うとか・・・
同じCPU使用なのでこれも問題はないかと思われます。恐らく・・・
#ここもなんとも・・・orz


YuO  2005-10-05 06:47:54  No: 59058

/clrコンパイラオプションを使っているとか。

プロジェクトのプロパティのうち,
構成プロパティ-全般の,共通言語ランタイム  サポートの欄はどうなっていますか?
これが,「共通言語ランタイムの サポートを使用しない」以外であれば,
作成されたプログラムは.NET Framework 2.0の実行環境が必要になります。

Visual Studio 2005 β2であれば再頒布用ランタイムがついていたと思います。
Express Editionであれば,付いているかどうかは不明です。


DD.  2005-10-05 17:42:53  No: 59059

YuOさん回答ありがとうございます。

>/clrコンパイラオプションを使っているとか。
いえ、使っていないのです。。。

>これが,「共通言語ランタイムの サポートを使用しない」以外であれば,
>作成されたプログラムは.NET Framework 2.0の実行環境が必要になります。
確認しましたところ「共通言語ランタイムサポートを使用しない」と
なってありました。

>Visual Studio 2005 β2であれば再頒布用ランタイムがついていたと
>思います。
BATE2使用です。
コンパイルを行ったPCの「プログラムの追加と削除」から
「.NET Framework 2.0 Beta2」及び「日本語 Language Pack Beta2」
を確認致しました。


DD.  2005-10-05 18:07:10  No: 59060

報告になります。

"別PC"にて「.NET Framework1.1」及び「.NET Framework2.0 Beta2」を
入れ、exeを実行しましたが上記と同じエラーになってしまいました。

後は「Platform SDK」くらいしか考えられないような気がします。。。

ここで教えて頂きたいのですが、
Googleで「platform sdk download」とググってみると
「Windows Server 2003 SP1 Platform SDK」のインストール画面が
でてくるのですが、これは通常の"Win32アプリケーション"を作成する
上で入れるものでよろしいのでしょうか?
#その他でめぼしいものが見当たらなかったもので。。。

Windows Server 2003の部分がすごく気になるので・・・

#いろいろと試行錯誤して頂きありがとうございます。


porin  2005-10-05 20:33:02  No: 59061

問題ないと思います。
(Overview に書いてあります)

ただ Platform SDK を入れて解決できるものか微妙ですが……
(期待を何度となく裏切られたので……)


YuO  2005-10-05 21:25:42  No: 59062

会社の2005βの入っていないマシンを使ってみて,問題を発生させることができました。

2005β2は,標準でDLL版のCRTを利用するように設定されています。
なので,
構成プロパティ - C/C++ - コード生成の欄を,
マルチスレッド DLL (/MD)
から,
マルチスレッド (/MT)
に変更してやるか,MSVCR80.DLLを含めてやる必要があります。
# が,MSVCR80.DLLのベータ版は再配布不可。Go Liveで可能ですが。


DD.  2005-10-05 22:10:50  No: 59063

porinさん、YuOさん回答ありがとうございます。

>問題ないと思います。
そうですか^^  ありがとうございます。

>会社の2005βの入っていないマシンを使ってみて,
>問題を発生させることができました。
わざわざ試して頂きありがとうございます。

>マルチスレッド (/MT)
>に変更してやるか,MSVCR80.DLLを含めてやる必要があります。
ご指摘の通り、これを変更してやることで無事"別PC"からプログラムの
実行を行うことができました。
ありがとうございます^^

あつかましくも少しお聞きしたいと思います。
>2005β2は,標準でDLL版のCRTを利用するように設定されています。
これがなされていることにより何が変わってくるのでしょうか?

また、はずしていたら申し訳ないです。
>マルチスレッド DLL (/MD)
>から,
>マルチスレッド (/MT)
特に私が設定を変えた覚えはないのですがデフォルトで(/MDd)
になっており、(/MT)に変更したところ主にSTL部分?にエラーが検出されました。これを(/MTd)に変更したところ正常にコンパイルされました。

何が違うのでしょうか?


YuO  2005-10-05 22:25:15  No: 59064

> >2005β2は,標準でDLL版のCRTを利用するように設定されています。
> これがなされていることにより何が変わってくるのでしょうか?

VC++の標準ライブラリが,EXEにリンクされるのではなくMSVCR80.DLLを使うようになります。

> >マルチスレッド DLL (/MD)
> >から,
> >マルチスレッド (/MT)
> 特に私が設定を変えた覚えはないのですがデフォルトで(/MDd)
> になっており、(/MT)に変更したところ主にSTL部分?にエラーが検出されました。これを(/MTd)に変更したところ正常にコンパイルされました。
> 何が違うのでしょうか?

/MDdだった,ということは,デバッグ用の構成を利用しています。
リリース用の構成を使わないと配布はできません。
ちゃんと構成をReleaseにしてコンパイルした物を配布しましょう。
# VC++2005β2であれば,Go Liveライセンスに同意しておく必要があります。


DD.  2005-10-05 22:44:58  No: 59065

YuOさん回答ありがとうございます。

>VC++の標準ライブラリが,EXEにリンクされるのではなくMSVCR80.DLLを
>使うようになります。
なるほど。だからMSVCR80.DLLがないとエラーになるんですね。

>ちゃんと構成をReleaseにしてコンパイルした物を配布しましょう。
おぉ。そうなのですかorz
色々あるんですね。。。そこらへん^^;
配布はしないです。ただ自分で趣味で作ったプログラムで遊んでるだけですから^^;
#人に見せられるようなもの作ってませんからorz

># VC++2005β2であれば,Go Liveライセンスに同意しておく
>必要があります。
む。ややこしそうな内容が。。。
VC++2005β2で作成したプログラムを配布するにはライセンスがいるってことですね。もし、人様に見せられるものを作れたならばその時に^^;


DD.  2005-10-06 02:21:50  No: 59066

すいません。解決チェック忘れてました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加