現在「Microsoft Visual C++ 2008 Express Edition」というフリーのソフトで一緒に付いてきたコマンドプロントを使用しています。
C言語の勉強のためにサンプルをコピーしてきてコマンドプロントでコンパイルしているのですが、ほとんどのサンプルプログラムがコンパイルエラーが出ます。
これはサンプルが悪いのでしょうか?
それともC言語は使うコンパイラによって使える関数(ヘッダー?)が変わるのでしょうか?
コンパイルエラーの対策はどのようにするのが一番良いのでしょうか?
初歩的な質問だとは思いますが、どうかご回答宜しくお願いします。
コンパイルについて
Re:コンパイルについて
どんなサンプルをコンパイルしたときにどんなエラーが出るか、
具体的に提示してください。そうしないと、どうしようもありません。
なお、コマンドプロンプト(command prompt)が正しいです。
具体的に提示してください。そうしないと、どうしようもありません。
なお、コマンドプロンプト(command prompt)が正しいです。
Re:コンパイルについて
失礼しました。
確かにどのようなプログラムで
どのようなエラーがわからないと
答えられませんね・・・・
【エラー文】
test.c(5) : error C2061: 構文エラー : 識別子 'ShutDown'
test.c(5) : error C2059: 構文エラー : ';'
test.c(5) : error C2059: 構文エラー : ')'
test.c(63) : error C2275: 'time_t' : この型は演算子として使用できません
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\crtdefs.h(582) :
'time_t' の宣言を確認してください。
test.c(63) : error C2146: 構文エラー : ';' が、識別子 'NowTime' の前に必要です。
test.c(63) : error C2065: 'NowTime' : 定義されていない識別子です。
test.c(64) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(66) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(69) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(70) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(71) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(74) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(76) : error C2065: 'ShutDownMin' : 定義されていない識別子です。
test.c(77) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(77) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(81) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(85) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(90) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(99) : error C2065: 'NowTime' : 定義されていない識別子です。
test.c(100) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(100) : error C2065: 'NowTime' : 定義されていない識別子です。
test.c(100) : warning C4133: '関数' : 'int *' と 'const time_t *' の間で型に互換
性がありません。
test.c(100) : warning C4047: '=' : 間接参照のレベルが 'int' と 'tm *' で異なって
います。
test.c(103) : error C2065: 'Sec' : 定義されていない識別子です。
test.c(103) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(103) : error C2223: '->tm_sec' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(105) : error C2065: 'Sec' : 定義されていない識別子です。
test.c(105) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(105) : error C2223: '->tm_sec' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(108) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(108) : error C2223: '->tm_year' : 左側が構造体か共用体に対するポインタで
はありません。
test.c(109) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(109) : error C2223: '->tm_mon' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(110) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(110) : error C2223: '->tm_mday' : 左側が構造体か共用体に対するポインタで
はありません。
test.c(111) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(111) : error C2223: '->tm_hour' : 左側が構造体か共用体に対するポインタで
はありません。
test.c(112) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(112) : error C2223: '->tm_min' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(113) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(113) : error C2223: '->tm_sec' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(117) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(122) : error C2065: 'SumSec' : 定義されていない識別子です。
test.c(122) : error C2065: 'ShutDownSumSec' : 定義されていない識別子です。
test.c(124) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(124) : error C2065: 'ShutDownSumSec' : 定義されていない識別子です。
test.c(124) : error C2065: 'SumSec' : 定義されていない識別子です。
test.c(128) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(128) : error C2065: 'ShutDownSumSec' : 定義されていない識別子です。
test.c(128) : error C2065: 'SumSec' : 定義されていない識別子です。
test.c(132) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(133) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(134) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(135) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(139) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
これが全てです。
エラーがこんなに出るとは思いませんでした。
プログラムは添付します。
確かにどのようなプログラムで
どのようなエラーがわからないと
答えられませんね・・・・
【エラー文】
test.c(5) : error C2061: 構文エラー : 識別子 'ShutDown'
test.c(5) : error C2059: 構文エラー : ';'
test.c(5) : error C2059: 構文エラー : ')'
test.c(63) : error C2275: 'time_t' : この型は演算子として使用できません
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\crtdefs.h(582) :
'time_t' の宣言を確認してください。
test.c(63) : error C2146: 構文エラー : ';' が、識別子 'NowTime' の前に必要です。
test.c(63) : error C2065: 'NowTime' : 定義されていない識別子です。
test.c(64) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(66) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(69) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(70) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(71) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(74) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(76) : error C2065: 'ShutDownMin' : 定義されていない識別子です。
test.c(77) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(77) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(81) : error C2065: 'ShutDownSec' : 定義されていない識別子です。
test.c(85) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(90) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(99) : error C2065: 'NowTime' : 定義されていない識別子です。
test.c(100) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(100) : error C2065: 'NowTime' : 定義されていない識別子です。
test.c(100) : warning C4133: '関数' : 'int *' と 'const time_t *' の間で型に互換
性がありません。
test.c(100) : warning C4047: '=' : 間接参照のレベルが 'int' と 'tm *' で異なって
います。
test.c(103) : error C2065: 'Sec' : 定義されていない識別子です。
test.c(103) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(103) : error C2223: '->tm_sec' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(105) : error C2065: 'Sec' : 定義されていない識別子です。
test.c(105) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(105) : error C2223: '->tm_sec' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(108) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(108) : error C2223: '->tm_year' : 左側が構造体か共用体に対するポインタで
はありません。
test.c(109) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(109) : error C2223: '->tm_mon' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(110) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(110) : error C2223: '->tm_mday' : 左側が構造体か共用体に対するポインタで
はありません。
test.c(111) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(111) : error C2223: '->tm_hour' : 左側が構造体か共用体に対するポインタで
はありません。
test.c(112) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(112) : error C2223: '->tm_min' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(113) : error C2065: 'NowLocalTime' : 定義されていない識別子です。
test.c(113) : error C2223: '->tm_sec' : 左側が構造体か共用体に対するポインタでは
ありません。
test.c(117) : error C2143: 構文エラー : ';' が '型' の前にありません。
test.c(122) : error C2065: 'SumSec' : 定義されていない識別子です。
test.c(122) : error C2065: 'ShutDownSumSec' : 定義されていない識別子です。
test.c(124) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(124) : error C2065: 'ShutDownSumSec' : 定義されていない識別子です。
test.c(124) : error C2065: 'SumSec' : 定義されていない識別子です。
test.c(128) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(128) : error C2065: 'ShutDownSumSec' : 定義されていない識別子です。
test.c(128) : error C2065: 'SumSec' : 定義されていない識別子です。
test.c(132) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(133) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(134) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(135) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
test.c(139) : error C2065: 'RemainderSumSec' : 定義されていない識別子です。
これが全てです。
エラーがこんなに出るとは思いませんでした。
プログラムは添付します。
Re:コンパイルについて
なるほど
C++にするということですね。
やってみましたが
/out:test.exe
test.obj
test.obj : error LNK2019: 未解決の外部シンボル __imp__ExitWindowsEx@8 が関数 "bo
ol __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 "boo
l __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__AdjustTokenPrivileges@24
が関数 "bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__LookupPrivilegeValueA@12
が関数 "bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__GetTokenInformation@20 が
関数 "bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__OpenProcessToken@12 が関数
"bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.exe : fatal error LNK1120: 外部参照 6 が未解決です。
このようなエラーになってしまいました。
C++にするということですね。
やってみましたが
/out:test.exe
test.obj
test.obj : error LNK2019: 未解決の外部シンボル __imp__ExitWindowsEx@8 が関数 "bo
ol __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 "boo
l __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__AdjustTokenPrivileges@24
が関数 "bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__LookupPrivilegeValueA@12
が関数 "bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__GetTokenInformation@20 が
関数 "bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル __imp__OpenProcessToken@12 が関数
"bool __cdecl ShutDown(void)" (?ShutDown@@YA_NXZ) で参照されました。
test.exe : fatal error LNK1120: 外部参照 6 が未解決です。
このようなエラーになってしまいました。
Re:コンパイルについて
コマンドプロンプトからですか。
ビルドツールは cl.exeですか?
もしそうなら多分コンパイルするとき、
[color=#d0d0ff" face="sans-serif]
> cl test.cpp[/color]
としていると思いますが、
[color=#d0d0ff" face="sans-serif" >
> cl test.cpp /link User32.lib advapi32.lib[/color]
としてみてください。
ビルドツールは cl.exeですか?
もしそうなら多分コンパイルするとき、
[color=#d0d0ff" face="sans-serif]
> cl test.cpp[/color]
としていると思いますが、
[color=#d0d0ff" face="sans-serif" >
> cl test.cpp /link User32.lib advapi32.lib[/color]
としてみてください。
Re:コンパイルについて
>> cl test.cpp /link User32.lib advapi32.lib
> としてみてください。
実行したら無事にコンパイルされました。
「cl test.cpp」
とやるのと
「cl test.cpp /link User32.lib advapi32.lib」
では、どのように変わるのでしょう?
「cl test.cpp /link User32.lib advapi32.lib」
を使うときはどのような時に使うのですか?
> としてみてください。
実行したら無事にコンパイルされました。
「cl test.cpp」
とやるのと
「cl test.cpp /link User32.lib advapi32.lib」
では、どのように変わるのでしょう?
「cl test.cpp /link User32.lib advapi32.lib」
を使うときはどのような時に使うのですか?
Re:コンパイルについて
プログラムでMessageBoxなどの関数を呼び出していると思いますがこれらの関数の実際に動作する実体はライブラリに存在します。
自分の書いたプログラムを動かすにはこれらのライブラリの実体とリンクする必要があるのです。
未解決の外部シンボル
というエラーは外部ライブラリとのリンクが出来ていないときに出ます
その後に関数名が表示されますがC++では関数名が内部表現に修飾されているので実際に使った関数名と違ったものになっています(同じ部分があるので推測は出来ると思います)
マイクロソフトのサイトで関数を検索するとどのライブラリにある関数か書いてあります
以下はMessageBoxの解説に書いてある部分です
------------------------
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダーファイル:Winuser.h 内で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
Unicode:すべてのプラットフォームで Unicode 版と ANSI 版を実装
-------------------------
自分の書いたプログラムを動かすにはこれらのライブラリの実体とリンクする必要があるのです。
未解決の外部シンボル
というエラーは外部ライブラリとのリンクが出来ていないときに出ます
その後に関数名が表示されますがC++では関数名が内部表現に修飾されているので実際に使った関数名と違ったものになっています(同じ部分があるので推測は出来ると思います)
マイクロソフトのサイトで関数を検索するとどのライブラリにある関数か書いてあります
以下はMessageBoxの解説に書いてある部分です
------------------------
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダーファイル:Winuser.h 内で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
Unicode:すべてのプラットフォームで Unicode 版と ANSI 版を実装
-------------------------