我是在进行混合语言编程(Matlab 调用c的dll).下面就是在dll编程过程中
出现的问题:
如果我全部用WIN32来做该dll,用windows.h头文件,应该是没有问题的。有默认的命令行build.bat工具。Matlab带的。该工具对win32的程序编译没有问题。
但是我想使用CString class, 因此想以MFC为主,WIN32 API为辅,因此用
stdafx.h作用头文件,同时调用WIN32 API前用“::”符号。
简短程序如下:
DEVMODE devmode;
DWORD iMode;
BOOL bRetVal;
CString sDevMode[256]; iMode = 0; do
{
bRetVal = ::EnumDisplaySettings(NULL, iMode, &devmode);
iMode++;
if (bRetVal)
{
sDevMode[iMode-1].Format("%d x %d, %d bits %dhz", devmode.dmPelsWidth,
devmode.dmPelsHeight, devmode.dmBitsPerPel, devmode.dmDisplayFrequency);
}
}
while (bRetVal);
AfxMessageBox("An error occurred!!!");
这样通过了编译,但是没有通过link.可能原因是那个命令行build.bat工具是针对WIN32API写的,没有办法对付这样MFC为主的写法。因此出现如下错误:vdGetSupportedResList.bj user32.lib
Creating library _lib2890.x and object _lib2890.exp
nafxcw.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype
nafxcw.lib(filelist.obj) : error LNK2019: unresolved external symbol __mbctype referenced in function "void __stdcall _AfxAbbreviateName(char *,int,int)" (?_AfxAbbreviateName@@YGXPADHH@Z)
nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv
nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc
vdGetSupportedResList.dll : fatal error LNK1120: 3 unresolved externals --------------------------------------------因此我想请教以下几点:
1。如果要在WIN32程序(比如new project wizard中新开的是个WIN32项目)中调用MFC的东东(非界面,比如CString),应该怎么设置编译呢?(主要是图个方便,好像CString挺顺手的。)
2。如果要在WIN32程序(比如new project wizard中新开的是个WIN32项目)中调用MFC的东东(界面,比如CDialog),应该怎么设置编译呢?(主要是图个方便,MFC设计界面好像挺容易。)上面的matlab给的build.bat工具就是能针对win32程序,但是似乎需要添加点库和命令才能用MFC还请大侠指点。
出现的问题:
如果我全部用WIN32来做该dll,用windows.h头文件,应该是没有问题的。有默认的命令行build.bat工具。Matlab带的。该工具对win32的程序编译没有问题。
但是我想使用CString class, 因此想以MFC为主,WIN32 API为辅,因此用
stdafx.h作用头文件,同时调用WIN32 API前用“::”符号。
简短程序如下:
DEVMODE devmode;
DWORD iMode;
BOOL bRetVal;
CString sDevMode[256]; iMode = 0; do
{
bRetVal = ::EnumDisplaySettings(NULL, iMode, &devmode);
iMode++;
if (bRetVal)
{
sDevMode[iMode-1].Format("%d x %d, %d bits %dhz", devmode.dmPelsWidth,
devmode.dmPelsHeight, devmode.dmBitsPerPel, devmode.dmDisplayFrequency);
}
}
while (bRetVal);
AfxMessageBox("An error occurred!!!");
这样通过了编译,但是没有通过link.可能原因是那个命令行build.bat工具是针对WIN32API写的,没有办法对付这样MFC为主的写法。因此出现如下错误:vdGetSupportedResList.bj user32.lib
Creating library _lib2890.x and object _lib2890.exp
nafxcw.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype
nafxcw.lib(filelist.obj) : error LNK2019: unresolved external symbol __mbctype referenced in function "void __stdcall _AfxAbbreviateName(char *,int,int)" (?_AfxAbbreviateName@@YGXPADHH@Z)
nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv
nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc
vdGetSupportedResList.dll : fatal error LNK1120: 3 unresolved externals --------------------------------------------因此我想请教以下几点:
1。如果要在WIN32程序(比如new project wizard中新开的是个WIN32项目)中调用MFC的东东(非界面,比如CString),应该怎么设置编译呢?(主要是图个方便,好像CString挺顺手的。)
2。如果要在WIN32程序(比如new project wizard中新开的是个WIN32项目)中调用MFC的东东(界面,比如CDialog),应该怎么设置编译呢?(主要是图个方便,MFC设计界面好像挺容易。)上面的matlab给的build.bat工具就是能针对win32程序,但是似乎需要添加点库和命令才能用MFC还请大侠指点。
解决方案 »
- SetDIBitsToDevice按扫描法显示的图像是倒立的
- 关于创建的子对话框中按钮失效的问题,困扰好久了,哪位大侠能给指点下!!
- 如何修改对话框的标题栏?谢谢!!!!!!!!!!!!!!!!
- OpenGL里画圆的函数是什么?
- (急!Up有分)高手请指教:MSMQ的设计
- 在程序内如何以其他用户的身份启动一个进程?
- vc 将工程的stack reserve size改为10M后 出现了各种诡异问题
- 请问怎么重画标题条,包括最小化,最大化按钮?
- 求助:关于动态创建控件的消息响应函数
- ★报酬500元,为原来的exe加个外壳,需求如下
- 请问如何获得程序以外的鼠标坐标,不是本程序中。
- 请问关于双击ListCtrl控件中的记录的问题???
我没法建立工程阿。对于win32程序,matlab的build.bat都已经包含了需要的库,
所以我命令行编译那个只有一个.cpp的程序倒也没有问题。但是对于这种需要MFC支持的Win32程序,或者整个就是MFC的程序,
需要往build.bat作些什么改动呢?Matlab的build.bat(又名MSVC70OPTS.BAT,是用于命令行生成matlab里用的dll的)如下:----------------------------------------------
@echo off
rem MSVC70OPTS.BAT
rem
rem Compile and link options used for building MEX-files
rem using the Microsoft Visual C++ compiler version 7.0
rem
rem $Revision: 1.2.4.2 $ $Date: 2003/11/12 12:50:30 $
rem
rem ********************************************************************
rem General parameters
rem ********************************************************************set MATLAB=%MATLAB%
set MSVCDir=%MSVCDir%
set DevEnvDir=%MSVCDir%\..\Common7\Tools
set PATH=%MSVCDir%\BIN;%DevEnvDir%;%DevEnvDir%\bin;%MSVCDir%\..\Common7\IDE;%MATLAB_BIN%;%PATH%;
set INCLUDE=%MSVCDir%\ATLMFC\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\PlatformSDK\include;%INCLUDE%
set LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;%MSVCDir%\PlatformSDK\lib;%MATLAB%\extern\lib\win32;%LIB%rem ********************************************************************
rem Compiler parameters
rem ********************************************************************
set COMPILER=cl
set COMPFLAGS=-c -Zp8 -G5 -W3 -DMATLAB_MEX_FILE -nologo
set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"
set NAME_OBJECT=/Forem ********************************************************************
rem Linker parameters
rem ********************************************************************
set LIBLOC=%MATLAB%\extern\lib\win32\microsoft\msvc70
set LINKER=link
set LINKFLAGS=/dll /export:%ENTRYPOINT% /MAP /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /implib:%LIB_NAME%.x
set LINKOPTIMFLAGS=
set LINKDEBUGFLAGS=/debug
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%.dll"
set RSP_FILE_INDICATOR=@rem ********************************************************************
rem Resource compiler parameters
rem ********************************************************************
set RC_COMPILER=rc /fo "%OUTDIR%mexversion.res"
set RC_LINKER=set POSTLINK_CMDS=del "%OUTDIR%%MEX_NAME%.map"
set POSTLINK_CMDS1=del %LIB_NAME%.x
我有一点没有说清楚,抱歉。
这个build.bat是在matlab里调用mex命令调用的,实际上也就是命令行
调用compiler和linker。显然我是可以建一个工程,来做dll。但是这样还是在MSVC工程里做的。
不是命令行调用的。我现在需要请教的是命令行调用的。如何在命令行支持MFC编译呢?有大侠能够修改上面的build.bat里的编译选项吗?
:)
如果仅是数据,可以使用STL的string类
即由
set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"变成了如下两行:
set OPTIMFLAGS=/MT -O2 -Oy- -DNDEBUG
set DEBUGFLAGS=/MTd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb" 就通过了连接。请大侠讲解一下,是什么缘故呀?但是有如下几个警告,是什么意思呀?
LINK : warning LNK4089: all references to 'SHELL32.dll' discarded by /OPT:REF
LINK : warning LNK4089: all references to 'comdlg32.dll' discarded by /OPT:REF
LINK : warning LNK4089: all references to 'ole32.dll' discarded by /OPT:REF
/MD Multithreaded dll
但是我用MD就老出我前面报告的错误,把编译选项从/MD改成了/MT,(原件)
rem ********************************************************************
rem Compiler parameters
rem ********************************************************************
set COMPILER=cl
set COMPFLAGS=-c -Zp8 -G5 -W3 -DMATLAB_MEX_FILE -nologo
set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"
set NAME_OBJECT=/Fo
即把上面中的
set OPTIMFLAGS=/MD -O2 -Oy- -DNDEBUG
set DEBUGFLAGS=/MDd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb"变成了如下两行:
set OPTIMFLAGS=/MT -O2 -Oy- -DNDEBUG
set DEBUGFLAGS=/MTd -Zi -Fd"%OUTDIR%%MEX_NAME%.pdb" 就不出错了。
但是最后生成的还是dll,奇怪。