前言
最近作毕业设计遇到了的问题:
整个毕业设计工程,我是采用COM组件技术进行开发的
对于其中一些简单的组件,我懒着启动庞大的VS 2003 IDE环境。
所以干脆设置了几个系统环境变量,直接使用命令行进行编译,
稍大一点的工程,写上个MAKEFILE文件,倒也方便快捷。
但是使用过程中却遇到了许多棘手的问题:
背景
我使用的编译器是VC2003
cl.exe版本号:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
link.exe版本:
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
问题
5月12号:
需要一个Dialog,与用户交流配置信息和启动选项
在编写了资源文件 MyUI.rc和resource.h后
编写测试程序,主函数如下:
//////////////////////////////////////////////////
// win32入口点函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_DLG_SHOW),
NULL, DLGPROC(MainDialogProc), NULL);
return TRUE;
}
编译:cl /O2 /Ot /W3 /nologo /c TextMain.cpp
链接:link /subsystem:windows TextMain.obj user32.lib kernel32.lib gdi32.lib advapi32.lib
顺利通过,但是程序运行时没有出现Dialog,而是直接返回了。钻研一天,无果!
最后的办法:改用VC IDE进行编译,顺利通过测试
5月14号:
编译一个COM组件的DLL服务器程序
因为注册COM组件需要获得DLL入口点地址
所以编写DLL源文件如下:
//
// 文件中 略去无关代码n行
//
static HMODULE g_hModule = NULL ; // DLL module handle
///////////////////////////////////////////////////////////
//
// DLL module information
//
BOOL WINAPI DllMain(HINSTANCE hInstDll,
DWORD dwReason,
void* lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
g_hModule = hInstDll ;
DisableThreadLibraryCalls(hInstDll);
}
return TRUE ;
}
MAKEFILE文件如下:
#
# Flags
#
CPP_FLAGS=/c /MTd /Zi /Od /D_DEBUG /EHsc
DLL_LINK_FLAGS=/DLL /DEBUG
LIBS=UUID.lib Advapi32.lib Ole32.lib
# 略掉n行
DZCComponent3.dll : DZCComponent3.obj GUIDs.obj Registry.obj CMPNT1.def
link $(DLL_LINK_FLAGS) DZCComponent3.obj GUIDs.obj Registry.obj
$(LIBS) /DEF:DZCComponent3.def
regsvr32 -s CMPNT1.dll
# 略掉n行
#end
命令行:nmake
LINK : fatal error LNK2023: 错误的 dll 或入口点 'msobj71.dll'
NMAKE : fatal error U1077: “link” : 返回代码“0x7e7”
钻研一天,无果!
最后的办法:改用VC IDE进行编译,顺利通过测试
结论
VS 2003的集成IDE隐藏了很多底层编译、链接过程的细节,苦于每日繁忙不得精研之
所以作文以记之,望来日得闲,仔细琢磨,勿忘!