【问题标题】:Linker Errors using directX and Visual Studio 2010使用 directX 和 Visual Studio 2010 的链接器错误
【发布时间】:2011-07-20 17:03:07
【问题描述】:

因此,我已经为此工作了两个小时的大部分时间,尽管我似乎遵循互联网上每个论坛/指南的确切说明,但在尝试将 DirectX 与 Visual 结合使用时,我仍然遇到链接器错误工作室 2010。

这是我开始的代码:

#include <D3DX10.h>  
#include <iostream>   
using namespace std;

ostream& operator<<(ostream& os, D3DXVECTOR3& v){  
      os << "(" << v.x << ", " << v.y << ", " << v.z << ")\n";     
      return os; 
}

int main (){  
    return 0;  
}

我已经下载并安装了 SDK,并在项目配置属性中手动设置了适当的包含和库目录。我还设置了额外的链接器输入依赖项:

d3dx10.lib
d3dx10d.lib

但是,我在编译时仍然收到以下错误:

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol WinMain@16 referenced in function __tmainCRTStartup

1>C:\Users\Ben\Documents\Visual Studio 2010\Projects\DX Practice\Debug\DX Practice.exe : 致命错误 LNK1120: 1 unresolved externals

感谢任何和所有的帮助。

编辑:将 int main() 更改为 int WinMain()。新错误:

1>c:\users\ben\documents\visual studio 2010\projects\dx practice\dx practice\main.cpp(10): 警告 C4007: 'WinMain' : must be '__stdcall'

1>c:\users\ben\documents\visual studio 2010\projects\dx practice\dx practice\main.cpp(10): error C2731: 'WinMain' : 函数不能重载

1> c:\users\ben\documents\visual studio 2010\projects\dx practice\dx practice\main.cpp(10) :参见“WinMain”声明

EDIT2:想通了 -

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

感谢大家的帮助:)

【问题讨论】:

  • 我从来没有说过 WinMain 是按照 main 的方式定义的。
  • 为什么首先需要使用WinMain?请保留它main。更改链接器设置:Linker->System->SubSystem

标签: c++ visual-studio-2010 linker directx


【解决方案1】:

除非您在 Visual Studio 中使用特殊设置,否则窗口可执行文件以 WinMain 函数开头,而不是常规的 main 函数。因此,您应该创建一个控制台应用程序,使用WinMain,或者使用该设置来使用常规的main 函数。

请注意,实际创建窗口不需要以WinMain 开头。这只是一个 Visual Studio 约定。

使用常规main 的选项位于项目设置对话框的“链接器->高级”下。它被称为“入口点”,要使用常规 main,您可以使用“mainCRTStartup”作为值。


如果你坚持使用WinMain,那么你需要正确定义它:

int WINAPI WinMain( HINSTANCE   hInstance,          // Instance
                   HINSTANCE    hPrevInstance,      // Previous Instance
                   LPSTR        lpCmdLine,          // Command Line Parameters
                   int          nCmdShow)           // Window Show State

【讨论】:

  • 这个的标准约定是什么?我应该更改选项以使用常规 main,还是使用 WinMain?
  • @Slims:这取决于你;这是你的代码。如果您喜欢 WinMain,请使用它。如果不这样做,只需确保在项目设置中使用常规选项即可。就个人而言,我已经有一段时间没有使用 WinMain 了,但这只是我的偏好。话虽如此,WinMain 确实提供了一些有用的数据(前一个实例和窗口显示状态),这取决于您的应用程序。
  • 注明。非常感谢您的所有帮助!
  • 改成“int WINAPI WinMain”时报错:C2731: 'WinMain': function cannot be overloaded
【解决方案2】:

如果您包含 Windows 标头,则链接器希望您提供 WinMain 函数,而不是常规的 main。 WinMain 入口点提供特定于 Windows 的数据,例如 HINSTANCEs。

【讨论】:

  • 不正确。控制台应用程序还可能包含 Windows 标头。
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 2011-11-05
  • 2012-02-27
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2013-12-27
相关资源
最近更新 更多