2014-01-20 45 views
0

我试图编译一个C程序(具体来说,Python解释器)作为一个纯静态链接的64位Windows二进制文件。我的命令行看起来是这样的:无法解析的外部符号主(无下划线)

cl /DPy_BUILD_CORE ... /link Advapi32.lib Shell32.lib User32.lib 

其中...是源文件的长长的名单,其中包括目录规范,我添加必要措施来解决悬而未决的符号错误的库规范。现在我得到这个错误:

LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup 

你可能会认为这个问题已经被问过,但在这种情况下main拼写领先_ - 这不以任何其它的发生我可以通过Google搜索找到事件。可以肯定的是,我试着编写一个最小的main()函数并抛出它,并且仍然给出了上述错误和重复的符号警告,所以这不是什么缺失。

任何想法这里有什么问题吗?

+1

你正试图建立一个控制台应用程序?我在编辑行中看不到'/ SUBSYSTEM'。你使用的是什么调用约定?我会从这些开始。 – WhozCraig

+0

@WhozCraig是的。我以前没有遇到/子系统,并且说它从来没有听说过;什么是参考?我正在使用的命令行看起来像通常用于构建命令行程序的命令行,包括默认调用约定;我不知道任何方式的.c文件的内容打破标准库和一个不同的.c文件之间的调用约定? – rwallace

+1

正如您所问,[在ms'网站上查看/SUBSYSTEM](http://msdn.microsoft.com/en-us/library/fcc1zstk.aspx)。它是一个链接器选项。调用约定是一个编译器选项(尽管它的确切语法让我感觉不到; sry)。 – WhozCraig

回答

0

你试图编译它像入口点的应用程序(而不是静态链接库)。

+0

是的 - 我试图将它编译为(独立的.exe)程序,而不是库。 – rwallace

+1

也许OP想要将所有依赖关系静态链接到一个EXE – manuell

+0

你的项目类型是什么?如果它是“Win32项目”,则入口点应该是(w)WinMain。如果它是“Win32控制台项目”,那么它应该是(w)main。取决于是否定义了UNICODE,名称_tmain被定义为main或wmain。 如果它是一个DLL,那么DllMain。 – Defter

0

从杰里米Kloth蟒蛇-win32的邮件列表:

文件清单也需要“.. \模块\ python.c”创建 可执行文件。 (使用VS2008进行x64测试)。

缺少领先的下划线来自于如何将符号导出到 64位PE与32位PE中。也就是说,64位PE不会将 下划线预先添加到导出的符号中。