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

通知
すべてクリア

[解決済] リンクエラー LNK1112


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

eMbedded Visual C++4.0 SP4にて、ハンディターミナルの開発をしているのですが、
今回、他の方が作った完全に動くソースを、同メーカーですが機種の違うハンディ用に
ソースを改造しています。
ソースは、一応修正して、ビルドを実行すると、コンパイルは通るのですが、
link.exeで以下のようなエラーが出ます。

*.lib(*.dll):fatal err LNK1112:module machine type 'MIPS'
conflicts with target machine type 'THUMB'

変更機種前のライブラリヘッダーを見てしまっているのかな・・・と、
プリコンパイル済みヘッダー*.pchを使用しないに設定を変えて見ましたが、変わりません。
eMbedded VC++の経験が浅く、設定など、どこをどう直したらいいのかわかりません。
どなかた、ご教授お願いいたします。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

組み込みについて知識がないのでわかりませんが、ターゲットマシンは 'MIPS'
と 'THUMB' のどちらが正しいのですか?

リンカに対する入力はソースファイルだけですか?
コンパイル済みの *.obj ファイルや *.lib ファイルががあったりしませんか?
もしあるなら、それがコンパイルされた時のコンパイルオプションと、今回のコンパイル
オプションが一致していない可能性があります。

既存のソースはプロジェクトごともらっていますか?
であれば、各ソースファイルのプロパティを見て、ターゲットマシンの型を指定するよう
なプロパティを探して、その設定を正しいものに統一してください。
どのプロパティかは、eVC++ 4.0 が手元にないのでわかりません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

プロジェクトを丸ごと持ってきてやっているのであれば、
プロジェクトはターゲットマシン用に起こした物を用意して
そこにソースレベルで持ってきた方が良いと思います。
プロジェクトの何処にその設定があって何処と何処を直せば良いかを
調べるよりもそちらの方が確実でしょう。

ファイルに直接プラグマでリンクするライブラリを指定しているような
場合は、その部分の修正が必要になるかもしれません。


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

aetos様
早速ありがとうございます。
ターゲットマシンは 前に機種のが'MIPS' で、改造したいのは 'THUMB' です。

コンパイル済みの *.obj ファイルや *.lib ファイルもあります。
コンパイルオプションは、タブのツールのオプションの中での設定になりますか?

PATIO様
早速ありがとうございます。
私のところに、eVc3.0とeVc4.0の完全に動くソースが別のPCにあるんです。
それで、今回は3.0のソースを、4.0にする必要があるのですが、その方法がわからないので、
きちんと動く4.0のソースと3.0のソースの違いを見るソフトを起動して、違いを4.0のソースに直接
コピーしてビルドしました。

新しい機種のSDKもインストールしたので、プロジェクトに名前も入っているのは確認しました。
おっしゃる通り新規で立ち上げなおし、ソースをもってきてみます。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> コンパイル済みの *.obj ファイルや *.lib ファイルもあります。

それらが 'MIPS' 向けにコンパイルされているとしたら、'THUMB' 向けのファイルとはリ
ンクできないと思います。
どっち向けにコンパイルされているか分からないなら、dumpbin /headers <*.obj や
*.lib のパス> として、一番上の方の「machine」の行に何と出ているか見てください。
コマンドプロンプトから単に dumpbin と打っても見つからないなら、eVC++ のコマンド
ラインビルド環境から実行してください。
手元に eVC++ の環境がなく、eVC++ を使ったこともないので正確なことはわかりません
が、たぶん、スタートメニューの eVC++ のあたりに、それっぽい項目があると思いま
す。

> コンパイルオプションは、タブのツールのオプションの中での設定になりますか?

たぶん違うと思います。
プロジェクトのオプションです。


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

せっかく教えていただいたのに、コマンドプロンプトにての操作は、
うまく動かすことが出来ず、結局できませんでした。
新規で作ろうにも、新規で作り出したことが無く、設定などをどうしたらいいものか
わからなく・・・結局LNK1112エラーのままです。

メーカーに問い合わせると、設定やコーディングのことはお答えできません。とのことで、
詳しくは聞けませんでしたが、まずは、

*.lib(*.dll)をARMV4Iにリコンパイルする必要があると思います。

と言われました。

SDKをインストールした後に出来た新しいフォルダに、以前のハンディのヘッダファイルや
libファイルを新しいフォルダにそのままコピーし、
作業する*.VCWの画面にて[ツール]-[オプション]で、
以前のハンディからコピーしたフォルダを指定しましたが、それがだめなのでしょうか?

dll(lib)をARMV4I用にリコンパイルする・・・というのは、
どういうことなのでしょうか?
dllをリコンパイルって、拡張子エラーとなり意味がわからずに困っています。
度々、すみません。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

エンベデッドはよく知らないけど
> dllをリコンパイルって、拡張子エラーとなり意味がわからずに困っています。
単にリビルドってことじゃないの。つまり、ソースをコンパイルして、作成しなおせ、
ってこと。

> 以前のハンディのヘッダファイルやlibファイルを新しいフォルダにそのままコピー
し、
ヘッダはいいけど、Libはリビルドする必要があるんじゃないの。
/* ヘッダ中に環境依存が書いてなければだけど */


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

同じソースコードを
THUMB 用にコンパイルしたバイナリと
MIPS 用にコンパイルしたバイナリとは
非互換であって混ぜることはできない、ってあたりまではOK?

自作プロジェクト構成が以下のようになっているとしよう。
aaa.c + bbb.c + xyz.lib (xyz.dll のインポートライブラリ)
この aaa.c はソースコードなので THUMB 用 MIPS 用にコンパイルすることが可能。
そのための設定は当該プロジェクト中のコンパイルオプションで行える。

一方で xyz.dll はそれようのソースコード+それようのプロジェクトで作られた
成果物であって、今までの経緯を見るに MIPS 用にコンパイル済みなわけだ。

だから、いまやらなきゃならないことは xyz.dll(xyz.lib) のほうの修正。
手法としてはいくつかあるわけだが
・その xyz.dll の作者にお願いして THUMB 用にコンパイルしてもらう
 (コンパイル後の xyz.dll + xyz.lib だけを入手する)
・その xyz.dll のソースコード+プロジェクトを丸ごと入手し
 THUMB 用にコンパイルしなおす (その結果の dll+lib を元プロジェクトに反映)

DLL/LIB が MIPS では動作確認済みなんだろうけど、 THUMB で動く保証は無いわけで
そっちの完全デバッグ+検証が必要になるかもしれないぞ
もしかしたら作り直す必要があるかもしれない。
コピーするだけで動くわけが無い。


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

みなさま、ご教授くださり、ありがとうございます。

みなさまのご指導を元に色々整理してみると、
同メーカだからライブラリは全て使えるものと思い込み、
今回のライブラリにはないものを、修正前のハンディのとこからコピーし、
それを[ツール][オプション]でディレクトリなどを指定していたため、
ソースのコンパイルではエラーを出さずにくぐり抜けていて、
リンクで、前のハンディのDLLと今回のDLLが混ざってエラーになっていたようです。

コピーしたもの等を消して、ソースを更に修正します。

大変助かりました。返信してくださった方々に感謝しています。
また、どうぞ宜しくお願い致します。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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