LNK2019: 未解決の外部シンボルのエラーを解決するには?


トン  2006-05-18 22:26:07  No: 61859

cjpegmin.obj : error LNK2019: 未解決の外部シンボル _compress が関数 _cjpegmin で参照されました。
というエラーがでます。
どのようにすれば解決できるでしょうか?

一応cjpegmin.cではcompress()を

extern void compress();

で宣言しています。

よろしくお願いします。


トン  2006-05-18 22:32:24  No: 61860

エラー全内容は以下の通りです。

リンクしています...
LINK : warning LNK4098: defaultlib 'LIBC' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
cjpegmin.obj : error LNK2019: 未解決の外部シンボル _compress が関数 _cjpegmin で参照されました。
compress.obj : error LNK2001: 外部シンボル ""char * program" (?program@@3PADA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * ac_bits1" (?ac_bits1@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * ac_huffval1" (?ac_huffval1@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * dc_bits1" (?dc_bits1@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * dc_huffval1" (?dc_huffval1@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * ac_bits0" (?ac_bits0@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * ac_huffval0" (?ac_huffval0@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * dc_bits0" (?dc_bits0@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * dc_huffval0" (?dc_huffval0@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""int * qtbl1" (?qtbl1@@3PAHA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""int * qtbl0" (?qtbl0@@3PAHA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""int * jpeg_natural_order" (?jpeg_natural_order@@3PAHA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""int exp_w" (?exp_w@@3HA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""int exp_h" (?exp_h@@3HA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * comp_cr" (?comp_cr@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * comp_cb" (?comp_cb@@3PAEA)" は未解決です。
compress.obj : error LNK2001: 外部シンボル ""unsigned char * comp_y" (?comp_y@@3PAEA)" は未解決です。
./Debug\/cjpegsc.exe : fatal error LNK1120: 外部参照 18 が未解決です。

ビルドログは "file://c:\SystemC\Jpeg\cjpegsc\Debug\\BuildLog.htm" に保存されました。
cjpegsc - エラー 19、警告 1

---------------------- 終了 ----------------------

    ビルド : 0 正常終了、1 失敗、0 スキップ


YuO  2006-05-18 23:26:46  No: 61861

CとC++を混ぜていませんか?
Cから呼ばれるC++関数は,extern "C"で修飾されていなければなりません。
また,C++でのC関数の宣言にも,extern "C"が必要になります。

でもって,最初のwarningは利用しているCRTが混ざっている場合に起きます。
リンクしているライブラリのCRTに合わせる必要があります。
# or 同一のCRTを利用するライブラリをリンクするようにする。


トン  2006-05-18 23:44:05  No: 61862

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

cjpegmin.cで言われたように"C"を付けました。

extern "C" void compress();

このように・・・。
しかし、エラーがでます。

------ ビルド開始 : プロジェクト : cjpegsc, 構成 : Debug Win32 ------

コンパイルしています...
compress.cpp
コードを生成中...
コンパイル中...
cjpegmin.c
c:\SystemC\JPEG\cjpegsc\cjpegmin.c(6) : error C2059: 構文エラー : '文字列'
c:\SystemC\JPEG\cjpegsc\cjpegmin.c(31) : warning C4013: 関数 'compress' は定義されていません。int 型の値を返す外部関数と見なします。
コードを生成中...

ビルドログは "file://c:\SystemC\Jpeg\cjpegsc\Debug\\BuildLog.htm" に保存されました。
cjpegsc - エラー 1、警告 1

---------------------- 終了 ----------------------

    ビルド : 0 正常終了、1 失敗、0 スキップ

でもって、
>でもって,最初のwarningは利用しているCRTが混ざっている場合に起きます。
>リンクしているライブラリのCRTに合わせる必要があります。
># or 同一のCRTを利用するライブラリをリンクするようにする。

この部分が理解できません。
私はVCに関してかなりの初心者です。

お願い致します。


kure  2006-05-19 00:00:04  No: 61863

> extern "C" void compress();

extern "C" extern void compress();

で、戻り値の型と引数の数と型と関数の名前が一致していれば大丈夫なはず。

CRT=C Runtime Library
VCにはCRTが複数あって、MFCを使う場合、マルチスレッドの場合、Debug/Releaseの場合、DLLを作る場合でそれぞれ異なるCRTが存在します。
具体的にはプロジェクトのプロパティのそれぞれの設定を統一すれば良いです。


トン  2006-05-19 00:07:51  No: 61864

kureさんありがとうございます。

extern "C" extern void compress();

にしても同じエラーがでます。

>VCにはCRTが複数あって、MFCを使う場合、マルチスレッドの場合、Debug/Releaseの場合、DLLを作る場合でそれぞれ異なるCRTが存在します。
>具体的にはプロジェクトのプロパティのそれぞれの設定を統一すれば良いです。

どれをどのように設定すればいいのかサッパリわかりません。
もう泣きたい気持ちになります。

詳細お願いします


シャノン  2006-05-19 00:40:18  No: 61865

> リンクしているライブラリのCRTに合わせる必要があります。

おそらく、外部の JPEG 処理ライブラリを取り込んでいるんでしょう。
そのライブラリのビルドに使われている CRT と、今作っているプログラムの CRT を合わせなければならんということです。
ライブラリの方に合わせてプロジェクトの設定を変えるか、それで都合が悪ければ、プロジェクトの方に合わせてライブラリをリビルドする必要があります。

> どれをどのように設定すればいいのかサッパリわかりません。
> 詳細お願いします

そちらの環境を書いていただかないと、アドバイスのしようがありません。


むしろ…  2006-05-19 00:47:31  No: 61866

>詳細お願いします
あなたに環境等の詳細をお願いしますと言いたい


subaru  2006-05-19 01:03:21  No: 61867

>cjpegmin.cで言われたように"C"を付けました。
>
>extern "C" void compress();

cjpegmin.c側ではなくてcompress.cpp側の宣言が
extern "C"でなくてはいけないのだと思いますけど?

あるいはcjpegmin.cの拡張子をcppにするのはだめですか?


YuO  2006-05-19 01:43:50  No: 61868

> cjpegmin.cで言われたように"C"を付けました。
> extern "C" void compress();

ちゃんとC++を勉強しましょう。

compress関数の定義において,extern "C"を付けるのです。

> VCにはCRTが複数あって、MFCを使う場合、マルチスレッドの場合、Debug/Releaseの場合、DLLを作る場合でそれぞれ異なるCRTが存在します。

種類分けが違います。VC++ 7.1の場合だと,大まかに
・デバッグ用かリリース用か
・シングルスレッド用かマルチスレッド用か
に分けられ,マルチスレッド用は,
・EXE/DLLにリンクする
・DLLとして存在するCRTを利用する
に分けられます。
# 合計6種類。マルチスレッド (DLL)とはDLL用ではなく,DLLとなっているCRTを利用することに注意。

VC++ 8.0ではシングルスレッド用が無いので合計4種類になります。

> どれをどのように設定すればいいのかサッパリわかりません。

まずはあなたの環境について説明してください。
説明しようにも説明のしようがないです。


kure  2006-05-19 02:14:38  No: 61869

>種類分けが違います
あら、MFCって関係ないんでしたっけ??
このへんうろ覚えなんで誤情報だったようですみません。
「DLLを作る場合」ってのは完全にこちらの間違いです。
重ねて訂正(YuOさんがしてくれてますが)させてもらいます。


トン  2006-05-20 02:50:23  No: 61870

LNK2019に関しては解決できたのですがLNK2001がどうしても解決できません。これに関して教えてください。
一応自分なりに調べてみるとグローバル変数関係があやしいようです。
実際、私のプログラムもglobal.hというファイルの中にprogramやac_bits1などを宣言しています。


YuO  2006-05-20 03:08:08  No: 61871

C++の勉強をちゃんとしましょう。

Cの翻訳単位で定義された関数/変数をC++の翻訳単位で宣言するときや,
Cの翻訳単位から使われる関数/変数をC++の翻訳単位で定義するときは,
extern "C"が必須です。

ヘッダの先頭に,
#ifdef __cplusplus
extern "C" {
#endif
を,末尾に
#ifdef __cplusplus
}
#endif
を記述するだけでもある程度違いが出るかもしれません。

このあたりがわからないのであれば,subaruさんの書かれている
> あるいはcjpegmin.cの拡張子をcppにするのはだめですか?
に全面的に賛成です。


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

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






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