Visual C++ 2009编译libmikmod
1. 主页 http://mikmod.raphnet.net/
2. 最新版本 3.2.0-beta2,2004年2月发布
下载 http://mikmod.raphnet.net/files/libmikmod-3.2.0-beta2.zip
3. 编译依赖
DirectX SDK中的头文件。最新的DirectX SDK 2009 Auguest可以从微软(http://is.gd/4Q3Mo)下载。或者只下载其中include目录和lib目录打包(http://is.gd/4Q416)。
4. 编译方法
解压后,从Visual Studio 2008的命令行提示符下进入win32目录,首先设置INCLUDE变量,然后编译。如果编译静态链接库,可以参见下例(把directx的目录修改成自己的):
cd win32 set INCLUDE=..\..\directxsdk-0908\include;%INCLUDE% nmake -f makefile.static
5. Bug
include\mikmod_internal.h文件中有bug,导致不能在Visual Studio 2008下编译,在该文件的include之后加入下面5行:
#ifdef _mm_malloc #undef _mm_malloc #undef _mm_calloc #undef _mm_free #endif
6. 其他注意事项
1. 编译Multithreaded DLL版的静态库
编译生成的静态库,为了更好的与其他库交互,最好是编译生成Multithreaded DLL版本,也就是编译时加/MD参数。由于libmikmod默认的头文件不支持编译静态库的同时,链接到MSVCRT的Muiltithreaded DLL。所以要做相应修改。
2. 生成include\mikmod.h
由于Windows系统没有configure过程,include目录下仅有一个mikmod.h.in,要把其中的版本号替换生成mikmod.h。
3. 静态库中缺少load_asy
静态库中包含的目标文件好像不全,却load_asy,需要修改Makefile将其加进来。
7. 完整的patch
下面是包含上述改动完整的patch。打上后把include\mikmod.in.h改名为include\mikmod.h即可。
diff -Naur libmikmod-3.2.0-beta2\include\mikmod.h.in libmikmod-3.2.0-beta2-2\include\mikmod.h.in --- libmikmod-3.2.0-beta2\include\mikmod.h.in Wed Feb 18 09:10:40 2004 +++ libmikmod-3.2.0-beta2-2\include\mikmod.h.in Mon Apr 26 18:33:00 2004 @@ -44,7 +44,7 @@ #ifdef DLL_EXPORTS #define MIKMODAPI __declspec(dllexport) #else -#define MIKMODAPI __declspec(dllimport) +#define MIKMODAPI #endif #else #define MIKMODAPI @@ -54,9 +54,9 @@ * ========== Library version */ -#define LIBMIKMOD_VERSION_MAJOR @LIBMIKMOD_MAJOR_VERSION@L -#define LIBMIKMOD_VERSION_MINOR @LIBMIKMOD_MINOR_VERSION@L -#define LIBMIKMOD_REVISION @LIBMIKMOD_MICRO_VERSION@L +#define LIBMIKMOD_VERSION_MAJOR 3L +#define LIBMIKMOD_VERSION_MINOR 2L +#define LIBMIKMOD_REVISION 0L #define LIBMIKMOD_VERSION \ ((LIBMIKMOD_VERSION_MAJOR<<16)| \ @@ -83,7 +83,7 @@ typedef char CHAR; #endif -@DOES_NOT_HAVE_SIGNED@ + #if defined(__arch64__) || defined(__alpha) /* 64 bit architectures */ diff -Naur libmikmod-3.2.0-beta2\include\mikmod_internals.h libmikmod-3.2.0-beta2-2\include\mikmod_internals.h --- libmikmod-3.2.0-beta2\include\mikmod_internals.h Wed Feb 18 08:29:18 2004 +++ libmikmod-3.2.0-beta2-2\include\mikmod_internals.h Tue Nov 10 10:47:10 2009 @@ -47,6 +47,12 @@ #pragma warning(disable:4761) #endif +#ifdef _mm_malloc +#undef _mm_malloc +#undef _mm_calloc +#undef _mm_free +#endif + /*========== More type definitions */ /* SLONGLONG: 64bit, signed */ diff -Naur libmikmod-3.2.0-beta2\win32\Makefile.static libmikmod-3.2.0-beta2-2\win32\Makefile.static --- libmikmod-3.2.0-beta2\win32\Makefile.static Wed Jan 21 12:29:36 2004 +++ libmikmod-3.2.0-beta2-2\win32\Makefile.static Mon Nov 09 15:28:39 2009 @@ -11,7 +11,7 @@ # Your compiler here CC=cl # Compiler flags -CFLAGS=/nologo /O2 /MTd /Zi /Fm /c /DWIN32 /DDRV_DS /DDRV_WIN /DHAVE_FCNTL_H /DHAVE_MALLOC_H /DHAVE_LIMITS_H +CFLAGS=/nologo /O2 /MD /Zi /Fm /c /DWIN32 /DDRV_DS /DDRV_WIN /DHAVE_FCNTL_H /DHAVE_MALLOC_H /DHAVE_LIMITS_H COMPILE=$(CC) $(CFLAGS) /I..\include /I.. /I..\win32 .SUFFIXES: @@ -29,6 +29,7 @@ load_669.o load_amf.o load_dsm.o load_far.o load_gdm.o load_it.o \ load_imf.o load_m15.o load_med.o load_mod.o load_mtm.o load_okt.o \ load_s3m.o load_stm.o load_stx.o load_ult.o load_uni.o load_xm.o \ + load_asy.o \ mmalloc.o mmerror.o mmio.o \ mdriver.o mdreg.o mloader.o mlreg.o mlutil.o mplayer.o munitrk.o mwav.o \ npertab.o sloader.o virtch.o virtch2.o virtch_common.o @@ -106,6 +107,9 @@ load_s3m.o: ..\loaders\load_s3m.c \ ..\win32\mikmod_build.h ..\include\mikmod_internals.h $(COMPILE) /Fo$@ ..\loaders\load_s3m.c +load_asy.o: ..\loaders\load_asy.c \ + ..\win32\mikmod_build.h ..\include\mikmod_internals.h + $(COMPILE) /Fo$@ ..\loaders\load_asy.c load_stm.o: ..\loaders\load_stm.c \ ..\win32\mikmod_build.h ..\include\mikmod_internals.h $(COMPILE) /Fo$@ ..\loaders\load_stm.c diff -Naur libmikmod-3.2.0-beta2\win32\mikmod_build.h libmikmod-3.2.0-beta2-2\win32\mikmod_build.h --- libmikmod-3.2.0-beta2\win32\mikmod_build.h Thu Feb 19 09:15:22 2004 +++ libmikmod-3.2.0-beta2-2\win32\mikmod_build.h Mon Nov 09 15:19:11 2009 @@ -44,7 +44,7 @@ #ifdef DLL_EXPORTS #define MIKMODAPI __declspec(dllexport) #else -#define MIKMODAPI __declspec(dllimport) +#define MIKMODAPI #endif #else #define MIKMODAPI
Visual Studio 2009? 师兄最近研究的内容很诡异…
不是研究,是写论文写不动搞的娱乐,研究怎么编译魔兽引擎
我是使用libmikmod用于symbian wm iphone 跨平台游戏引擎开发的。
这里面有几个函数,没有找到实现。
你这边有遇到吗?对这几个函数的时候有什么线索没?我在网上搜索了没有搜索到。
1>libmikmod.lib(mloader.obj) : error LNK2019: unresolved external symbol __mm_delete_file_reader referenced in function _Player_LoadTitle
1>libmikmod.lib(mloader.obj) : error LNK2019: unresolved external symbol __mm_new_file_reader referenced in function _Player_LoadTitle
1>libmikmod.lib(mloader.obj) : error LNK2019: unresolved external symbol __mm_fopen referenced in function _Player_LoadTitle
1>libmikmod.lib(mloader.obj) : error LNK2019: unresolved external symbol __mm_iobase_setcur referenced in function _Player_LoadTitle_internal
1>libmikmod.lib(mloader.obj) : error LNK2019: unresolved external symbol __mm_iobase_revert referenced in function _Player_LoadGeneric_internal
1>libmikmod.lib(sloader.obj) : error LNK2019: unresolved external symbol __mm_read_I_SWORDS referenced in function _SL_LoadInternal
1>libmikmod.lib(sloader.obj) : error LNK2019: unresolved external symbol __mm_read_M_SWORDS referenced in function _SL_LoadInternal
看名字有点像是c++库的函数,iosbase, new, delete之类的,是不是忘了链接标准c++库
/*========== Portable file I/O */
extern MREADER* _mm_new_file_reader(FILE* fp);
extern void _mm_delete_file_reader(MREADER*);
估计是要自己实现的一套可以移植接口。只有定义没有实现,标准C++没有这些函数。
这个库你能正常使用和播放成功吗?
可以播放,我用它编译的stratagus引擎玩魔兽很正常啊
真奇怪,你搜索一下mm_new_file_reader这个函数,看看你里面怎么实现的?