混编过程中,由于调用了MATLAB的动态链接库,可能产生如下问题:
(1)C运行时库和MFC库冲突造成重复定义错误
编译过程有时会出现类似下面的错误,如:NAFXCW .LIB errprLNiC2Q0}x "void--叫ec,operdtt)J}delete (void*)”3@YAXF}IJC}乃alres}dY debuted } L1}3CTvfT比山}t}obj)其中NAF}CCW. LIB是M FC静态连接库,而LIBCM T.Iib静态链接的C运行时库。
这种情况主要是C运行时库和MFC的库冲突造成的。由于第三方库如MATLAB动态库的加入,使得在MFC库运行之前已经运行了C运行时库,造成了重复定义,解决的办法就是将那个提示出错的库放到另外一个库的前面,这样就可以避开这个链接错误,在VC莱单P rCfjeet>etti}tgx>L. inl>aitlgary选择input在ObectllibraryModules栏中按顺序添入库的名字,且作为命令行中的前两个库,使各个库按照设定的顺序链接。
(2)C运行时库冲突造成重复定义错误
VC工程中设置选项LT se rurYti'n e I ib } ry用来指定程序运行时使用的C运行时库单线程或多线程,静态或动态链接,Debug版本或Release版本),当有第三方库(Third party library)存在时,很容易发生类似下面这样的错误:errorLNK2005free already defined in LIBC0vIT lib这说明你的工程使用了不同类型的CRT L屯一般如果确定工程里其他的库都是统一的,很可能问题出在MATLAB库上,经调试判断MATLhB库调用的是MSVCRT fifa也就是动态C运行时库,建议在User Runtine libraryy中选择M u Iti-Tread.DLL。
由于vc对重复定义的要求比较严格,用第三方库时,如果用多种方法都不能解决,可以通过设置强制忽略重复定义。
(3)标准化头文件引起的冲突
工程中调用了m文件,要注意有可能标准化头文件和调用的m文件翻译过来的C++件中定义引起冲突,C++标准化以后的标准头文件把标准C++库的组件放在一个名为std的名字空间里面,使用时要使用using nanespace std语句使。记空间中所有定义的标识符暴露在全局空间中,一般要确定全局空间没有重名的对象才能这么做。但并不需要特意阅读和修改的由m文件翻译过来的C++文件经常会被忽略掉,如果在m文件翻译过来的C++文件使std名字空间可见,则两个文件里的相同名称的标识符都暴露在可见的名字空间里,这样标准程序库中类名和函数名与MATLAB库中的类名或是函数名就有可能发生名字冲突,从而会引起ambiguoussymbol确定的识标符)错误。解决方法是避免usingnamespace.sd这类语句放在可能被翻译过来的C书凌件包含的头文件中,例如预编译头文件。stlafxh等。
(4)程序的运行与发布的问题
当调用的m文件内包含图形功能时,程序运行时可能出现只能执行一次的情况,报错:runtine errorabnnmal prngram teminationo这是因为M 1}TLAB中函数的操作一定要在初始化M}LTLAB函数库和图像函数库后才能调用,不然会出现“需要C,C+涵数库”的错误提示,而数学库的启动和关闭要保证程序的执行过程中它们分别只被调用1次,第二次调用就会出错,所以最好将数学库的启动和关闭语句放在程序的初始化和程序彻底退出函数中。
由于程序中调用了ATLAB数学函数库或图形库中的函数,所以需要附带ATLAB的这些函数库才能在没有安装ATLAB的机器上运行,mglinstaller.exe解压出的bin\win32目录下的所有链接库拷到开发程序的所在目录中并随程序一起移植即可。
4 结束语
本文讨论的动力学仿真软件开发实例是在VisualC++6.0和MATLAB的平台上编译运行的,通过VisualC++C++ MATLAB混编技术可以结合VisualC++强大开发能力和MATLAB的丰富的工具箱快速开发出融合大量科学计算功能的应用程序,这种混编技术的研究和开发在图象处理、信号处理等需要大景计算、可视化界面的工程应用领域有广泛的应用价值。灵活运用这种联合编程方法,能够开发出界面友好、功能强大、不依赖于MATLAB环境的应用程序软件,并有效地提高应用系统的精确度和稳定性。