C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VS2005でのLNK2005対応手順


(過去ログ 84 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■50253 / inTopicNo.1)  VS2005でのLNK2005対応手順
  
□投稿者/ OROCHI (9回)-(2010/06/01(Tue) 16:19:10)

分類:[C/C++] 

OS:XP
VS:2005

こんにちは、現在自前のライブラリを作っています
そこで、内容は出来上がったのでいざビルドしようとすると、Debugでは正常にビルドできるのですが、
Releaseでビルドすると以下のようにLNK2005が大量に出ます

1>libcmt.lib(new.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) は既に MSVCRT.lib(MSVCR80.dll) で定義されています。
1>libcmt.lib(stdexcpt.obj) : error LNK2005: "public: __thiscall std::exception::exception(void)" (??0exception@std@@QAE@XZ) は既に MSVCRT.lib(MSVCR80.dll) で定義されています。
1>libcmt.lib(stdexcpt.obj) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) は既に MSVCRT.lib(MSVCR80.dll) で定義されています。
1>libcmt.lib(stdexcpt.obj) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) は既に MSVCRT.lib(MSVCR80.dll) で定義されています。
(以下略)

原因を調べると、Nafxcwd.lib とLibcmtd.lib というデバッグ用のライブラリがあるため、
Releaseでdllを作りたいときはライブラリの読み込み順を設定しなおさないと二重定義になるのが原因なようです


そこで回避方法を調べてみたのですが、VC6の場合は以下の方法で対処できるようです
1.[プロジェクト] メニューの [設定] をクリックします。
2.[プロジェクトの設定] ダイアログ ボックスの [設定の対象] ボックスで、リンク エラーが発生しているプロジェクト構成をクリックします。
3.[リンク] タブで、[カテゴリ] ボックスの一覧の [インプット] をクリックします。
4.[無視するライブラリ] ボックスに、ライブラリ名 (Nafxcwd.lib;Libcmtd.lib など) を挿入します。
5.[オブジェクト/ライブラリ モジュール] ボックスにライブラリ名を挿入します。行の先頭に正しい順序で 2 つのライブラリが並ぶようにする必要があります (Nafxcwd.lib Libcmtd.lib など)。

が、VS2005はインターフェース(というか各コマンドの名前)が全く違うので、同様のことを行おうとしてもどのように操作したらいいのか分かりません。
一応1は以下の手順で出したのですが、2以降をどのように行っていいのか分かる方、ご教授願えませんでしょうか?


1の手順
Alt+F7同時押し(もしくはプロジェクト→(プロジェクト名)のプロパティ)

ちなみに「構成プロパティ→リンカ→特定のライブラリの無視」で「Nafxcwd.lib;Libcmtd.lib」、
「構成プロパティ→リンカ→モジュール定義ファイル」で「Nafxcwd.lib;Libcmtd.lib 」と入れるとLNK2005
は消えたのですが、今度はLNK1104が出てしまいました
引用返信 編集キー/
■50255 / inTopicNo.2)  Re[1]: VS2005でのLNK2005対応手順
□投稿者/ 774RR (511回)-(2010/06/01(Tue) 17:18:06)
/NODEFAULTLIB オプションは無理やり LNK2005 を無視させるだけのものなので、
警告に対して自コード側の問題が絶対にないことを100%承知した上で使うべき代物だ。
「とりあえず警告が出てるから指定してみた」というのであれば必ず問題が発生するのでダメ。

MFC/ATL 使ってるの?使ってないの?まずはその辺から確認。

自作のファイル中で間違った #pragma comment(lib, ...) してるに1票
(#define による切り分け指定のタイミング遅れとか矛盾とか)
引用返信 編集キー/
■50257 / inTopicNo.3)  Re[2]: VS2005でのLNK2005対応手順
□投稿者/ OROCHI (11回)-(2010/06/01(Tue) 18:26:19)
返信ありがとうございます

> MFC/ATL 使ってるの?使ってないの?まずはその辺から確認。
どちらも使っていません。クラスライブラリ(CLR)の上に追加という形式です(C#で呼び出すことを想定したので)

> 自作のファイル中で間違った #pragma comment(lib, ...) してるに1票
> (#define による切り分け指定のタイミング遅れとか矛盾とか)
#pragmaはWarning4996を停止(sprintfのサポート切れ警告)に使っている程度なので特にlibに対しては使っていません

引用返信 編集キー/
■50262 / inTopicNo.4)  Re[3]: VS2005でのLNK2005対応手順
□投稿者/ とっちゃん (512回)-(2010/06/01(Tue) 21:30:25)
とっちゃん さんの Web サイト
No50257 (OROCHI さん) に返信

>>MFC/ATL 使ってるの?使ってないの?まずはその辺から確認。
> どちらも使っていません。クラスライブラリ(CLR)の上に追加という形式です(C#で呼び出すことを想定したので)
>
なにか別のライブラリをリンクしていませんか?
それが、CLRの形式と一致していないバージョンをリンクしようとしているものと思われます。
CLR形式の場合、MSVCRxx.DLLを使うバージョンをリンクしなければなりません(ランタイムのヒープ管理上の問題)。

また、UNICODEだとかそういうところなんかも引っかかる場合があります(wchar_tの扱いなど)。
そのあたりを中心に一度チェックしてみることをお勧めします。

引用返信 編集キー/
■50270 / inTopicNo.5)  Re[4]: VS2005でのLNK2005対応手順
□投稿者/ 774RR (512回)-(2010/06/02(Wed) 09:19:51)
とりあえず最初に関係ないもの分離しておこう。
NAFX*** は MFC のライブラリなので MFC を使っていないのであれば忘れてよい
(というか、指定してはならない)

そして今何が起きているかを整理すると
http://msdn.microsoft.com/ja-jp/library/abx4dbyh(VS.80).aspx
msvcrt.lib (msvcr80.dll) = /MD コンパイルオプションを使った場合のライブラリ
libcmt.lib = /MT コンパイルオプションを使った場合のライブラリ
が同時にリンクされているわけだ。

つまり、コンパイルオプションの異なる obj/lib が混在しているということ。
Visual C++ で作る .EXE .DLL 1個の中に /MT /MD の両者を混在させてはダメ。

ということでなぜ混在しているか?を追いかけなきゃならないわけだが、
当該プロジェクト内でコンパイルしている .obj ファイル同士でコンパイルオプションが違う
ということは極めて考えにくいので No50262
> なにか別のライブラリをリンクしていませんか?
というアドバイスになるわけだ。

そしてさらに
> CLR形式の場合、MSVCRxx.DLLを使うバージョンをリンクしなければなりません
であるわけで /MD /MDd オプションで作ったライブラリを使う必要がある。

ありがちなシナリオは
・サードパーティ製ライブラリを使っている
・そのライブラリ、コンパイルオプション /MT /MD /MTd /MDd 別に違うファイル名が付いている
・プロジェクトのリリース構成に追加したライブラリファイル名が違っている
だ。

その辺の詳細は俺たち読者には一切見えないのでご自分で検証しておくんなまし。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -