LNK1166 LNK4209 リンクエラー – プログラミング – Home

通知
すべてクリア

[解決済] LNK1166 LNK4209 リンクエラー


umi
 umi
(@umi)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

eMbedded Visual C++4.0 SP4にて、ハンディターミナルの開発をしているのですが、
プロジェクトをRelease にてリビルドしている時は、エラー無しで.exeもできあがり
問題なさそうなのですが、Debugでリビルドすると、.exeはできますが、警告がでます。

 *.obj : warning LNK1166 : cannot adjust code at Offset=0x00001000,
     rva=0x0003A4A8
 *.lib(*.obj) : warning LNK4209 : debugging information corrupt :
recompile module : linking object as if no debug info

ネット上で検索すると、
LNK1166は、LINKは指定通りにコードを埋め込めません。
LNK4209は、ファイルに誤った CV情報 があります。モジュールを再コンパイルおよび
再リンクをしなさい。
・・・とありましたが、知識が足りなく CV情報 の意味がわかりません。

同じソースでReleaseは通るのに、debugで警告が出るのはなぜなのでしょうか?

申し訳ございませんが、どなたかご教授を宜しくお願い致します。


引用未解決
トピックタグ
ISLe
 ISLe
(@ISLe)
ゲスト
結合: 18年前
投稿: 38
 

たぶんCVはCode Viewの略ですね。
objやlibに埋め込まれたデバッグ情報が(非互換で)使えないということ。
ソースから同じ環境で作り直してね、という意味のメッセージです。
ソース無しでリンクしてるobjやlibがあるのでは?


返信引用
umi
 umi
(@umi)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

ISLe様、早速ご返信頂きありがとうございます。

ご指摘通り、まずLNK1166のエラーになっているソースの中に、
非互換の部分を見つけてみたいと思います。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>ご指摘通り、まずLNK1166のエラーになっているソースの中に、
>非互換の部分を見つけてみたいと思います。

う~ん。ソース見てもわかんないかも。
ISLe さんの発言
「ソース無しでリンクしてるobjやlibがあるのでは?」
を、おちついて読み直してみてください。


返信引用
umi
 umi
(@umi)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

仲澤@失業者様、ありがとうございます。

>ソース無しでリンクしてるobjやlibがあるのでは?

 おっしゃる通りあります。
LNK1166の警告がでているオブジェクトは、自分のとこで作成した*.cppソースのもの
ですが、LNK4209の警告がでているライブラリは、ハンディのSDKをインストールした
時に作成されたフォルダの中に出来たソースが無いライブラリファイルで、それらを
リビルド時にインクルードしなければならないのですが、ソースが存在しないため
見ることができないでいます。

 Releaseでリビルドすると警告は出ず問題なく*.exeも出来て終るものが、
Debug時にだけ出るというのは、どちらの時にも同じものをインクルードしているのに、
Debug時にだけそのライブラリが使われて警告が出るという事なのでしょうか?

 度々、申し訳ありません。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

俺俺独自用語が使われているのでアレだけど

既にある hoge.lib (ハンディの SDK とやらに付属してきたもの) をリンクしてる
(ライブラリファイルはインクルードするとは言わない)
Release では異常ない
Debug では警告が出る
っつーことなら答えは簡単、その hoge.lib が Release 用にコンパイル済みなだけ。

Debug モードでは、開発環境 (コンパイラ+リンカ+デバッガ)は、
その「他社製 hoge.lib (コンパイル+デバッグ済み)」の中までデバッグしようとする
つまり hoge.lib がデバッグできるようにコンパイルしてあることを前提に動く

でも umi 氏が今使っている hoge.lib は Release 用にコンパイルされている
=デバッグには不向きな形式でコンパイルされている
=リンカーは hoge.lib をデバッグモードでコンパイルしなおせと警告してる
と、ただそれだけのこと。

対策:
1.hoge.lib の「デバッグ版」を探して入手し、リンク指定を変更する
 こうすると hoge.lib の中までデバッグできるようになる
 逆に言うと hoge.lib の提供者にとっては中が見られてしまうことになるわけで
 デバッグ版ライブラリを入手できる可能性はかなり期待薄
2.現状持っている hoge.lib をそのまま使い警告を無視する
 その hoge.lib は提供者が十分デバッグしている=バグが無いはずなので、
 プログラムが動かないとしたらその原因は自作部分にあるはずと考えていい。
 警告が出ても自作部分はデバッグできるのであれば、これが一番簡単。

警告が出て、でも EXE はできてる、んであれば何の問題も無いはずだ。


返信引用
umi
 umi
(@umi)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

tetrapod様、ありがとうございます。
 
 >警告が出て、でも EXE はできてる、んであれば何の問題も無いはずだ。
 
 わかりました。色々とても勉強になりました。
 このまま、進めていきたいと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました