首页 > 乱七八糟 > Visual C++ 2009编译libmikmod

Visual C++ 2009编译libmikmod

2009年11月10日 dipplum 发表评论 阅读评论

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
分类: 乱七八糟 标签: , ,
  1. Harry
    2009年11月14日00:15 | #1

    Visual Studio 2009? 师兄最近研究的内容很诡异…

  2. 2009年11月14日00:19 | #2

    不是研究,是写论文写不动搞的娱乐,研究怎么编译魔兽引擎

  3. 领跑游戏
    2009年11月28日04:50 | #3

    我是使用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

  4. 2009年11月28日09:09 | #4

    看名字有点像是c++库的函数,iosbase, new, delete之类的,是不是忘了链接标准c++库

  5. 领跑游戏
    2009年11月28日18:20 | #5

    /*========== Portable file I/O */

    extern MREADER* _mm_new_file_reader(FILE* fp);
    extern void _mm_delete_file_reader(MREADER*);

    估计是要自己实现的一套可以移植接口。只有定义没有实现,标准C++没有这些函数。
    这个库你能正常使用和播放成功吗?

  6. 2009年11月28日22:28 | #6

    可以播放,我用它编译的stratagus引擎玩魔兽很正常啊

  7. 领跑游戏
    2009年11月29日15:55 | #7

    真奇怪,你搜索一下mm_new_file_reader这个函数,看看你里面怎么实现的?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
This work by dipplum is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 China Mainland.