DXライブラリを使ったゲームにLuaを組み込む
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 2,709
前提・実現したいこと
DXライブラリを使ったゲーム開発で、Luaを使いたいと思い、
とりあえずtest.luaから変数valの値を取得して表示しようとしたのですが、
何かを二重定義しているみたいでエラーになってしまいます。
発生している問題・エラーメッセージ
1>------ ビルド開始: プロジェクト:LuaDXTest, 構成:Debug Win32 ------
1> main.cpp
1> LuaLib.lib(lstate.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカーのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。
1>LINK : warning LNK4075: /INCREMENTAL は /LTCG の指定によって無視されます。
1>main.obj : warning LNK4075: /EDITANDCONTINUE は /OPT:LBR の指定によって無視されます。
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: _strncmp は既に LIBCMTD.lib(strncmp.obj) で定義されています。
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: _strchr は既に LIBCMTD.lib(strchr.obj) で定義されています。
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: _longjmp は既に LIBCMTD.lib(longjmp.obj) で定義されています。
1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>C:\Users\xxx\Desktop\LuaDXTest\Debug\LuaDXTest.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
該当のソースコード
#include <DxLib.h>
#include "lua.hpp"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
SetDoubleStartValidFlag(TRUE);
//SetOutApplicationLogValidFlag(false); //ログ出力しない
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
SetWindowSizeChangeEnableFlag(true); //ウィンドウサイズを自由に変更できる
SetAlwaysRunFlag(TRUE); //ウィンドウがノンアクティブでも実行
int val=0;
lua_State *L = luaL_newstate();
// Luaファイルを開いて読み込み
if (luaL_dofile(L, "test.lua")) {
printf("%s\n", lua_tostring(L, lua_gettop(L)));
lua_close(L);
return 0;
}
lua_getglobal(L, "val");
val = (int)lua_tonumber(L, 1);
lua_pop(L, lua_gettop(L));
lua_close(L);
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
DrawFormatString(0, 0, GetColor(255, 255, 255), "%d", val);
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
test.luaは下の一行のみです。
val = 10
補足情報(言語/FW/ツール等のバージョンなど)
VC2013
Luaは5.3.2です
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
LuaLib.libはどのように作成しましたか?
エラー内容からはLuaLib.libはReleaseでビルドしたものを使用していて、それをDebugビルドしたプログラムに組み込んでいるため発生しているように推測されます。
よって、Debugビルド時はDebugビルドで作成したLuaLib.libを、Releaseビルド時はReleaseビルドで作成したLuaLib.libをリンクすることによって解決するものと思われます。
ここからは余談ですが
私はプロジェクトのターゲット毎のビルドの設定を行うよりLuaをビルドするほうが簡単なので、
Luaのスタティックライブラリを作成するプロジェクトを作成してそれを参照するようにしています。
Luaのビルドはソースディレクトリにあるlua.cとluac.c以外のソースコードをビルドすればよいだけです。
スタティックライブラリのプロジェクトの作成方法は以下を参考にしてください。
https://msdn.microsoft.com/ja-jp/library/ms235627(v=vs.120).aspx
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.38%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/10 16:44
プロジェクトのプロパティ->Debug->c/c++->コード生成->ランタイムライブラリをマルチスレッドデバッグ(/MTD)に
Releaseにして先程と同じ項目をマルチスレッド(/MT)にしてビルドしたものを使ったらうまくいきました。
ありがとうございました。