いつもお世話になっております。
ご相談内容は、自分が作成したオリジナルソース内のメソッド群のdll化に関してです。
一般的なダイナミックライブラリ生成手段(__declspec(dllexport)で関数宣言〜)は存じているのですが、
お作法どおりにオリジナルメソッドをdll化する際、メソッドの中身にDXライブラリのメソッドを使用していると、
ビルドの際に同じエラーが発生してしまいます。
状況は下記ですが、エラーの解決手段が分かりましたら教えてください。
■使用DXライブラリ
3.05f
■コンパイラ
MS VisualStudio 2008
■プロジェクトの構成
プロジェクトは Win32プロジェクト - dll & 空のプロジェクト で生成。
basic.cpp:dll化対象のメソッドを1つ宣言
basic.h:basic.cのメソッドのヘッダ宣言
DxLib.h:既存項目として追加
■コード(# ビルド検証用に最小限の構成で試しております)
-----------------<basic.cpp>-----------------
#include "DxLib.h"
#include "basic.h"
#include <windows.h>
#include <stdio.h>
__declspec(dllexport) void SDK_AppliEnd(){
DxLib_End();
}
-----------------<basic.h>------------------
__declspec(dllexport) void SDK_AppliEnd();
---------------------------------------------
上記でダイナミックライブラリのプロジェクトのみをビルド指定して、ビルドを実施。
■エラーログ
1>------ すべてのリビルド開始: プロジェクト: basic, 構成: Release Win32 ------
1>プロジェクト 'basic'、構成 'Release|Win32' の中間出力ファイルを削除しています。
1>コンパイルしています...
1>basic.cpp
1>リンクしています...
1>LIBCMT.lib(crtheap.obj) : error LNK2005: __malloc_crt は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(fflush.obj) : error LNK2005: _fflush は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRT.lib(cinitexe.obj) で定義されています。
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRT.lib(cinitexe.obj) で定義されています。
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRT.lib(cinitexe.obj) で定義されています。
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRT.lib(cinitexe.obj) で定義されています。
1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(winxfltr.obj) : error LNK2005: ___CppXcptFilter は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encoded_null は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(dosmap.obj) : error LNK2005: __errno は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1>LIBCMT.lib(getenv.obj) : error LNK2005: _getenv は既に MSVCRT.lib(MSVCR90.dll) で定義されています。
1> ライブラリ D:\VC++\☆近日使用\プロトタイプver0.9.0.001\Release\basic.lib とオブジェクト D:\VC++\☆近日使用\プロトタイプver0.9.0.001\Release\basic.exp を作成中
1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>LIBCMT.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。
1>D:\VC++\☆近日使用\プロトタイプver0.9.0.001\Release\basic.dll : fatal error LNK1120: 外部参照 1 が未解決です。
1>ビルドログは "file://d:\VC++\☆近日使用\プロトタイプver0.9.0.001\basic\Release\BuildLog.htm" に保存されました。
1>basic - エラー 20、警告 2
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========
VStudioのオプションのインクルードファイル指定などの使用前前提条件も満たしております。
オリジナルメソッド内(basic.c)のソースで、Dxライブラリのメソッドを使用しなければ、dllビルドは成功します。
basic.cでは DxLib_End のみ実施しておりますが、その他のメソッド(InitGraph や InitSoundMemなど…)でも同じ結果でした。
何か簡単な事を見落としているというだけかもしれませんが、宜しくお願いいたします。
お忙しい中失礼いたします。
//重蔵