VS2005:如何像 VS6 一样编译项目?

Posted

技术标签:

【中文标题】VS2005:如何像 VS6 一样编译项目?【英文标题】:VS2005: How to compile projects as if it was VS6? 【发布时间】:2011-09-16 05:18:18 【问题描述】:

我有一个使用 Visual Studio 2005 构建的项目。源代码也用于另一个使用 Visual Studio 6 构建的项目。

这会导致潜在的错误,因为 Security Enhancements in the CRT 引入的新 _s 函数在 VS6 中不存在。

为了确保我的源代码也能在 VS6 上运行良好,同时不必单独安装 VS6,我想用 VS2005 编译它们,但禁用新的安全功能(由 Security Enhancements 引入)。这可能吗?

【问题讨论】:

【参考方案1】:

您可以通过定义_CRT_SECURE_NO_WARNINGS 来禁用有关不安全函数的警告。您还可以为 _s 函数添加条件编译的包装器:在 VS2005 及更高版本上使用 _s 函数,以及在其他任何使用包装的 _s 函数上调用普通函数。

【讨论】:

我不想禁用警告。我在安全功能可用的情况下使用它们。 +1 用于提及包装器的机会。但是为了能够实现包装器,我必须知道需要包装哪些函数。是的,我可以查看msdn.microsoft.com/en-us/library/wd3wzwts(v=vs.80).aspx 和grep 这些函数的来源,但我正在寻找一种自动化的方式来指向这些函数。【参考方案2】:

VS .Net 和 VS6 使用的文件(框架、库、程序集)完全不同。尽管使用 COM wrapper 可以使用 VS6 中的一些库,但您不会在 VS .Net 中获得完全的 VS6 兼容性。

如果它很重要,移植代码的一次努力将是有益的。

【讨论】:

我当然知道使用安全功能的好处。但正如我所说,我的项目用于另一个使用 vS6 编译的项目,并且 不会 移植到 VS2005。【参考方案3】:

answer given by Sergius 启发了我经营自制方式:

在文件secure.c 中实现安全功能的包装器 #if (_MSC_VER >= 1400) 可以检查安全功能的可用性 将Security Enhanced Versions of CRT Functions 的列表放入文件中 在 cygwin 控制台上使用这几行代码搜索我的源代码中的每个模式:for i in $(cat secure_functions.txt) do grep -rn --exclude "secure.c" -w $i path/to/sources done 这将我指向出现新功能的地方。

备份:如果有人也想这样做,这里是安全功能列表:

_access_s
_waccess_s
_malloca
asctime_s
_wasctime_s
bsearch_s
_cgets_s
_cgetws_s
_chsize_s
clearerr_s
_controlfp_s
_cprintf_s
_cprintf_s_l
_cwprintf_s
_cwprintf_s_l
_cscanf_s
_cscanf_s_l
_cwscanf_s
_cwscanf_s_l
_ctime_s
_ctime32_s
_ctime64_s
_wctime_s
_wctime32_s
_wctime64_s
_ecvt_s
_fcvt_s
fopen_s
_wfopen_s
fprintf_s
_fprintf_s_l
fwprintf_s
_fwprintf_s_l
freopen_s
_wfreopen_s
fscanf_s
_fscanf_s_l
fwscanf_s
_fwscanf_s_l
_ftime_s
_ftime32_s
_ftime64_s
_gcvt_s
getenv_s
_wgetenv_s
gets_s
_getws_s
_gmtime32_s
_gmtime64_s
_itoa_s
_i64toa_s
_ui64toa_s
_itow_s
_i64tow_s
_ui64tow_s
_lfind_s
localtime_s
_localtime32_s
_localtime64_s
_lsearch_s
_ltoa_s
_ltow_s
_makepath_s
_wmakepath_s
_mbccpy_s
_mbccpy_s_l
_mbsnbcat_s
_mbsnbcat_s_l
_mbsnbcpy_s
_mbsnbcpy_s_l
mbsrtowcs_s
mbstowcs_s
_mbstowcs_s_l
memcpy_s
wmemcpy_s
memmove_s
wmemmove_s
_mktemp_s
_wmktemp_s
printf_s
_printf_s_l
wprintf_s
_wprintf_s_l
_putenv_s
_wputenv_s
qsort_s
rand_s
scanf_s
_scanf_s_l
wscanf_s
_wscanf_s_l
_searchenv_s
_wsearchenv_s
_snprintf_s
_snprintf_s_l
_snwprintf_s
_snwprintf_s_l
_snscanf_s
_snscanf_s_l
_snwscanf_s
_snwscanf_s_l
_sopen_s
_wsopen_s
_splitpath_s
_wsplitpath_s
sprintf_s
_sprintf_s_l
swprintf_s
_swprintf_s_l
sscanf_s
_sscanf_s_l
swscanf_s
_swscanf_s_l
strcat_s
wcscat_s
_mbscat_s
strcpy_s
wcscpy_s
_mbscpy_s
_strdate_s
_wstrdate_s
strerror_s
_strerror_s
_wcserror_s
__wcserror_s
_strlwr_s
_strlwr_s_l
_mbslwr_s
_mbslwr_s_l
_wcslwr_s
_wcslwr_s_l
strncat_s
_strncat_s_l
wcsncat_s
_wcsncat_s_l
_mbsncat_s
_mbsncat_s_l
strncpy_s
_strncpy_s_l
wcsncpy_s
_wcsncpy_s_l
_mbsncpy_s
_mbsncpy_s_l
_strtime_s
_wstrtime_s
strtok_s
_strtok_s_l
wcstok_s
_wcstok_s_l
_mbstok_s
_mbstok_s_l
_strupr_s
_strupr_s_l
_mbsupr_s
_mbsupr_s_l
_wcsupr_s
_wcsupr_s_l
tmpfile_s
tmpnam_s
_wtmpnam_s
_ultoa_s
_ultow_s
_umask_s
_vcprintf_s
_vcprintf_s_l
_vcwprintf_s
_vcwprintf_s_l
vfprintf_s
_vfprintf_s_l
vfwprintf_s
_vfwprintf_s_l
vprintf_s
_vprintf_s_l
vwprintf_s
_vwprintf_s_l
vsnprintf_s
_vsnprintf_s
_vsnprintf_s_l
_vsnwprintf_s
_vsnwprintf_s_l
vsprintf_s
_vsprintf_s_l
vswprintf_s
_vswprintf_s_l
wcrtomb_s
wcsrtombs_s
wcstombs_s
_wcstombs_s_l
wctomb_s
_wctomb_s_l

【讨论】:

以上是关于VS2005:如何像 VS6 一样编译项目?的主要内容,如果未能解决你的问题,请参考以下文章

visual stdio2005 如何像vc++6.0一样编译和调试啊

使用 Visual Studio 2005 构建 LynxOS 应用程序

为啥vs2005调试突然慢得像乌龟?

使用 C++ 的 VS6 和 VS2008 之间的数值精度差异?

如何设置VS2005的代码智能提示?

Sitelock 女士 1.15 和 VS 2005