一段很简单的代码,换 VS2017 就编译不过去了,想不通 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
llllllllllll
V2EX    Windows

一段很简单的代码,换 VS2017 就编译不过去了,想不通

  •  
  •   llllllllllll 2017-06-07 11:56:17 +08:00 6574 次点击
    这是一个创建于 3126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    只是修改了入口点。
    用 VS2005 就可以。
    但是换 2017 就不行。
    编译就报错。
    各位有碰到过这种诡异的现象么。

    #pragma comment(linker,"/entry:main")

    #include <stdio.h>
    #include <string.h>


    void main()
    {
    int n = strlen("ss");
    }
    13 条回复    2017-06-07 21:23:47 +08:00
    yksoft1
        1
    yksoft1  
       2017-06-07 12:37:23 +08:00
    估计是高版本的 CL 不支持这种 pragma 了。改入口最好还是直接在链接器命令行( makefile 里)指定参数,或者用 def 文件
    wevsty
        2
    wevsty  
       2017-06-07 12:52:51 +08:00
    编译的错误提示是?
    确定是编译错误而不是链接错误?
    我这里测试提示是 LNK2019。
    #pragma comment(linker,"/entry:main")
    手动指定 main 函数为起点,这样做会跳过 CRT 运行库初始化的过程,可能由于 VS 自身的一些机制引起各种奇奇怪怪的问题。
    llllllllllll
        3
    llllllllllll  
    OP
       2017-06-07 13:42:21 +08:00
    @wevsty
    错误的确是 2019
    有什么办法吗

    已启动生成: 项目: ConsoleApplication3, 配置: Debug Win32 ------
    1>main.obj : error LNK2019: 无法解析的外部符号 _strlen,该符号在函数 _main 中被引用
    1>MSVCRTD.lib(_init_.obj) : error LNK2019: 无法解析的外部符号 __CrtDbgReport,该符号在函数 __CRT_RTC_INIT 中被引用
    1>MSVCRTD.lib(_init_.obj) : error LNK2019: 无法解析的外部符号 __CrtDbgReportW,该符号在函数 __CRT_RTC_INITW 中被引用
    1>MSVCRTD.lib(_error_.obj) : error LNK2019: 无法解析的外部符号 _strcpy_s,该符号在函数 "void __cdecl _RTC_StackFailure(void *,char const *)" (?_RTC_StackFailure@@YAXPAXPBD@Z) 中被引用
    1>MSVCRTD.lib(_error_.obj) : error LNK2019: 无法解析的外部符号 _strcat_s,该符号在函数 "void __cdecl _RTC_StackFailure(void *,char const *)" (?_RTC_StackFailure@@YAXPAXPBD@Z) 中被引用
    1>MSVCRTD.lib(_error_.obj) : error LNK2019: 无法解析的外部符号 ___stdio_common_vsprintf_s,该符号在函数 __vsprintf_s_l 中被引用
    1>MSVCRTD.lib(_pdblkup_.obj) : error LNK2019: 无法解析的外部符号 __wmakepath_s,该符号在函数 "int __cdecl GetPdbDllPathFromFilePath(wchar_t const *,wchar_t *,unsigned int)" (?GetPdbDllPathFromFilePath@@YAHPB_WPA_WI@Z) 中被引用
    1>MSVCRTD.lib(_pdblkup_.obj) : error LNK2019: 无法解析的外部符号 __wsplitpath_s,该符号在函数 "int __cdecl GetPdbDllPathFromFilePath(wchar_t const *,wchar_t *,unsigned int)" (?GetPdbDllPathFromFilePath@@YAHPB_WPA_WI@Z) 中被引用
    1>MSVCRTD.lib(_pdblkup_.obj) : error LNK2019: 无法解析的外部符号 _wcscpy_s,该符号在函数 "int __cdecl GetPdbDllPathFromFilePath(wchar_t const *,wchar_t *,unsigned int)" (?GetPdbDllPathFromFilePath@@YAHPB_WPA_WI@Z) 中被引用
    1>MSVCRTD.lib(_pdblkup_.obj) : error LNK2019: 无法解析的外部符号 ___vcrt_GetModuleFileNameW,该符号在函数 "struct HINSTANCE__ * __cdecl GetPdbDll(void)" (?GetPdbDll@@YAPAUHINSTANCE__@@XZ) 中被引用
    1>MSVCRTD.lib(_pdblkup_.obj) : error LNK2019: 无法解析的外部符号 ___vcrt_GetModuleHandleW,该符号在函数 "struct HINSTANCE__ * __cdecl GetPdbDll(void)" (?GetPdbDll@@YAPAUHINSTANCE__@@XZ) 中被引用
    1>MSVCRTD.lib(_pdblkup_.obj) : error LNK2019: 无法解析的外部符号 ___vcrt_LoadLibraryExW,该符号在函数 "struct HINSTANCE__ * __cdecl GetPdbDll(void)" (?GetPdbDll@@YAPAUHINSTANCE__@@XZ) 中被引用
    1>MSVCRTD.lib(_chandler4gs_.obj) : error LNK2019: 无法解析的外部符号 __except_handler4_common,该符号在函数 __except_handler4 中被引用
    1>D:\CodeSpace\VS2017\TEST\ConsoleApplication3\Debug\ConsoleApplication3.exe : fatal error LNK1120: 13 个无法解析的外部命令
    1>已完成生成项目“ ConsoleApplication3.vcxproj ”的操作 - 失败。
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
    llllllllllll
        4
    llllllllllll  
    OP
       2017-06-07 13:43:08 +08:00
    @yksoft1
    感谢建议
    nicevar
        5
    nicevar  
       2017-06-07 13:51:26 +08:00
    加上#pragma comment(linker, "/INCLUDE:_mainCRTStartup")就行了
    llllllllllll
        6
    llllllllllll  
    OP
       2017-06-07 14:03:26 +08:00
    @nicevar
    擦,确实!
    为什么,这个是什么原理。
    请赐教!
    fo2w
        7
    fo2w  
       2017-06-07 14:06:29 +08:00
    我猜, 你改成
    #pragma comment(linker,"/entry:_main")
    也可以链接成功
    wevsty
        8
    wevsty  
       2017-06-07 14:19:36 +08:00
    @llllllllllll
    我不明白为什么一定要手动指定 main 函数作为入口。使用默认的 mainCRTStartup 显然是更安全的选项。
    如果一定要这样做可以使用下面的方法手动链接运行库。
    #pragma comment(lib, "msvcrtd.lib")
    #pragma comment(lib, "vcruntimed.lib")
    #pragma comment(lib, "ucrtd.lib")
    需要根据自己的编译选项来确定链接哪些库
    Release DLLs (/MD ): msvcrt.lib vcruntime.lib ucrt.lib
    Debug DLLs (/MDd): msvcrtd.lib vcruntimed.lib ucrtd.lib
    Release Static (/MT ): libcmt.lib libvcruntime.lib libucrt.lib
    Debug Static (/MTd): libcmtd.lib libvcruntimed.lib libucrtd.lib
    llllllllllll
        9
    llllllllllll  
    OP
       2017-06-07 17:36:08 +08:00
    @fo2w
    额,试了一把,不行呀
    llllllllllll
        10
    llllllllllll  
    OP
       2017-06-07 17:39:47 +08:00
    @wevsty
    好厉害,你的方法也成功了。
    其实不是非要怎么样。只是想试一把。
    xz
        11
    xz  
       2017-06-07 20:55:10 +08:00
    莫名其妙的就收到了提醒......
    llllllllllll
        12
    llllllllllll  
    OP
       2017-06-07 21:06:51 +08:00
    @xz
    哈哈,你关注了什么奇怪的关键词~
    isCyan
        13
    isCyan  
       2017-06-07 21:23:47 +08:00 via Android
    @xz
    @llllllllllll
    那一堆报错信息不小心把你艾特了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3250 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 00:46 PVG 08:46 LAX 16:46 JFK 19:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86