質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

379閲覧

1 つ以上の複数回定義されているシンボル見つかりましたの解決方法

NightBaron

総合スコア2

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/12/05 11:57

実現したいこと

FBXSDKのリンクを正しく行いたい

発生している問題・分からないこと

https://note.com/nwsnkn/n/n029730b9ad0d#e4355f81-f448-4222-918d-fb73d4f4b0a8
FbxSurfaceMaterialなどが対応するlibを入れていても使用できず上記のサイトを参考に設定しなおしていたところ複数回の定義エラーが出てしまいました。

エラーメッセージ

error

1 21>DirectXTex_Debug.lib(DirectXTexImage.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 31>DirectXTex_Debug.lib(DirectXTexWIC.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 41>DirectXTex_Debug.lib(DirectXTexD3D11.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 51>DirectXTex_Debug.lib(DirectXTexUtil.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。1>DirectXTex_Debug.lib(DirectXTexConvert.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 61>DirectXTex_Debug.lib(DirectXTexCompress.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。1>DirectXTex_Debug.lib(DirectXTexMipMaps.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません1>DirectXTex_Debug.lib(BC.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 71>DirectXTex_Debug.lib(BC4BC5.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 81>DirectXTex_Debug.lib(BC6HBC7.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 91>libcpmtd.lib(xthrow.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'directx.obj' と一致しません。 101>libcpmtd.lib(xthrow.obj) : error LNK2005: "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ) は既に msvcprtd.lib(MSVCP140D.dll) で定義されています。 111>libcpmtd.lib(xthrow.obj) : error LNK2005: "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPEBD@Z) は既に msvcprtd.lib(MSVCP140D.dll) で定義されています1>libcpmtd.lib(xthrow.obj) : error LNK2005: "void __cdecl std::_Xout_of_range(char const *)" (?_Xout_of_range@std@@YAXPEBD@Z) は既に msvcprtd.lib(MSVCP140D.dll) で定義されています。 121>LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 131>C:\Users\Owner\Desktop\HEW(仮)\05_PlayerAnimation FBXSDK\x64\Debug\Sample01.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 14 15

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

一つ以上の再定義のエラーが出てしまいました

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

リンクで書かれているnoteのこの部分が参考になるかと思います。

B.はFBXSDK部分を静的リンクします。さらにCライブラリにマルチスレッド対応の静的ランタイムライブラリ(LIBCMT.lib)を使います。これを使う場合、ランタイムライブラリオプション/MTを指定すること。

C.もFBXSDK部分を静的リンクします。さらにCライブラリにマルチスレッド対応のDLL(MSVCRT.lib経由でMSVCR100.DLL)を使います。ランタイムライブラリオプション/MDを指定すること。

  • コンパイルする際のコンパイルオプションで /MT, /MDのどちらを指定するか?
  • 使用するライブラリをxxx_mt.lib, xxx_md.libのどちらを利用するか?

を合わせないといけないです。

これだけで問題解決しないかもしれませんが、ひとまず確認してみてください。

投稿2024/12/05 15:31

toge_

総合スコア280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1 つ以上の複数回定義されているシンボルが見つかりました

二つ以上の異なるライブラリ上で同一のシンボルが定義されています
具体的には以下の状態を指します

  • シンボルに実装される値が競合している
  • 実装が誤って外部に公開されている

C/C++にはextern修飾子が実装されています
これはシンボルをプロトタイプ宣言し、その実装を外部のライブラリに依存することを明示します

extern int x , take_int(void);

externで修飾されたシンボルは、外部ライブラリで宣言される同一の戻り値と引数、及びシンボル名の変数または関数と統合され、実行ファイル内で一個のシンボルとして振る舞います

変数であれば値が提供され、関数であれば実装が共通化されます
externでマークされるシンボルには、外部へその実装を公開するライブラリでのみ、代入や関数実装が許容されます

反対にそのライブラリを利用するソースコードでは、externシンボルに一切の代入や実装の定義が許されません
これはexternの有無に関わらず、そのシンボルに実装を定義した時点で、それを外部に公開する状態となるためです

例えば二つ以上の異なるライブラリ間で同一のシンボルに実装が定義されていると、ライブラリ同士が互いにその実装を公開し合う形となり、競合が発生します

この状態を通知するエラーが

1 つ以上の複数回定義されているシンボルが見つかりました

という内容のメッセージです

実装をライブラリ内部へ隠蔽するには、static修飾子を用います

static int x,get_value(void);

これはシンボルを外部ライブラリから分離して固有化します
外部ライブラリとシンボル名が被る場合でもスコープは共有せず、実装も共通化されません

関数の場合、プロトタイプ宣言された時点で暗黙にexternが修飾される点に注意してください
変数の場合、externで修飾しない限り、型宣言のみの状態でも不定値がその実装として外部に提供されます

そのため、型宣言状態の変数にextetnを修飾することも解決策となります
同名の変数が外部ライブラリ内に存在する場合は、その値を受け取ることができます

尚これはグローバル領域におけるstaticの挙動です
クラス内におけるstaticはメンバをグローバル領域へ配置し、this引数を削除する静的化用途の修飾子なので、実装を隠蔽するにはその定義をクラス内に格納する必要があります

投稿2024/12/05 16:24

nanashi123

総合スコア122

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

DirectXTex_Debugとランタイムライブラリの設定の競合が主な理由でした。

投稿2024/12/06 04:03

NightBaron

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

再定義のエラーなんで、再定義しないようにすればいいです
複数定義してるところを見つけ出し、削除すればいいだけ、です

投稿2024/12/05 13:08

y_waiwai

総合スコア88074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NightBaron

2024/12/05 13:21

再定義のエラーがリブでの再定義らしいのですがどのようにすればいいのかわからないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問