想把win32和MFC混用,结果有如下几个连接错误,不知道有什么方法解决?

mizhael 美国大树资本有限公司 经理  2004-08-09 10:07:35
我是在进行混合语言编程(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。。。

还请大侠指点。

...全文
185 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mizhael 2004-08-14
这就奇怪了。我要做的是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,奇怪。
回复
mizhael 2004-08-12
/MD改成了/MT 究竟是什么意思呀?
回复
xxf2002 2004-08-12
/MT multithreaded
/MD Multithreaded dll
回复
basboy 2004-08-10
上面哪个是连接到多线程的crt库吧,下面的意义是你开启了优化选项,于是一些没有用到dll的隐式链接被去掉了
回复
basboy 2004-08-09
在msvc工程中作,然后生成一个make俄文件,最后在build.bat中加入make xxx.mak
:)
回复
mizhael 2004-08-09
hi, 感谢各位的指点。
我有一点没有说清楚,抱歉。


这个build.bat是在matlab里调用mex命令调用的,实际上也就是命令行
调用compiler和linker。

显然我是可以建一个工程,来做dll。但是这样还是在MSVC工程里做的。
不是命令行调用的。

我现在需要请教的是命令行调用的。

如何在命令行支持MFC编译呢?

有大侠能够修改上面的build.bat里的编译选项吗?
回复
flyelf 2004-08-09
创建一个mfc的dll,然后把代码移过去
回复
mizhael 2004-08-09
关键是程序是命令行编译的,没有工程。就一个.cpp的程序。
我没法建立工程阿。

对于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=/Fo

rem ********************************************************************
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

回复
microyzy 2004-08-09
看得不太明白呢,你建一个win32 dll的工程,指定需要MFC supported,不行吗?你只在内部代码里面使用mfc,到处的接口中不要有mfc的东西就行

能说说build.bat都作了什么工作吗,如果它也是调用ms的编译器和连接器,我想应该没问题的
回复
mizhael 2004-08-09
奇怪,只把编译选项从/MD改成了/MT,
即由
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
回复
mizhael 2004-08-09
我还是想在命令行搞定。不想进入MSVC Project Wizard。 any more ideas?
回复
snaill 2004-08-09
建议你是用WTL来做,接口和界面与MFC很像,有CString的类支持,编译结果和Win32相同,不过需要ATL支持

如果仅是数据,可以使用STL的string类
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-09 10:07
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……