win7 64位系统VS2012 链接DIRECTX SDK函数出错

Mr. Code 2013-05-17 08:44:42
系统:win7 64位
VS2012, directx sdk june 2010

出错信息:
引用
1>------ 已启动生成: 项目: Win32Project1, 配置: Debug Win32 ------
1> Win32Project1.cpp
1>Win32Project1.obj : error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 _wWinMain@16 中被引用
1>E:\vc\Win32Project1\Debug\Win32Project1.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========[


win32项目,vs2012自动产生项目后,编译运行正常,在_tWinMain函数增加Direct3DCreate9调用后就出错了。
    

#include "stdafx.h"
#include "Win32Project1.h"
#include "d3d9.h"
#include "d3dx9.h"

#define MAX_LOADSTRING 100

//#pragma comment(lib, "d3d9.lib")
//#pragma comment(lib, "d3dx9.lib")

// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
hInstance = GetModuleHandle(NULL);
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32PROJECT1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT1));

LPDIRECT3D9 g_pD3D = NULL;

if( NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



经过以下工程属性确认:
可执行目录 :$(DXSDK_DIR)\Utilities\bin\x64;$(ExecutablePath)
包含目录: $(DXSDK_DIR)\include;$(IncludePath)
库目录: $(DXSDK_DIR)\Lib\x64;$(LibraryPath)
预处理器定义 :WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
链接器子系统:窗口 (/SUBSYSTEM:WINDOWS)

后来又增加:
附加依赖项: $(DXSDK_DIR)\lib\x64\d3d9.lib;%(AdditionalDependencies)
附加库目录: $(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories)

而且确认了:D:\Program Files\Microsoft DirectX SDK (June 2010)\Include目录确实有包含的头文件,D:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x64确实有d3d9.lib文件和d3dx9.lib文件,VS2012环境变量可确认$(DXSDK_DIR)确实表示D:\Program Files\Microsoft DirectX SDK (June 2010)\。也试过增加
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
也试过改用x86的lib,结果都是一样的错误。
寻求解答。
...全文
268 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr. Code 2013-12-20
  • 打赏
  • 举报
回复
很遗憾,没满意答案,但能给我启发,给分。
yukoxiaowangzi 2013-09-11
  • 打赏
  • 举报
回复
不知道楼主的问题解决没,我今天也遇到一样的问题,也是64位系统,连接错误,后来我把附加依赖库改成x86的那个,就解决问题了。
bluewanderer 2013-05-17
  • 打赏
  • 举报
回复
VS2012本来就带DirectX11啊,不用配置任何东西就应该能找到d3d9.lib(不过没有d3d9x.lib,因为现在改用DirectXMath了) 另外如果有可能的话还是直接学D3D11吧。d3d9某种意义上也算是个历史符号了。
qj5656 2013-05-17
  • 打赏
  • 举报
回复
赵4老师 2013-05-17
  • 打赏
  • 举报
回复
项目、属性、C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、附加库目录:填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器(点前面的+展开)、输入、附加依赖项:填写附加依赖库的名字.lib 空格间隔多项
赵4老师 2013-05-17
  • 打赏
  • 举报
回复
在Win64下: 64位dll在c:\windows\system32目录下; 32位dll在c:\windows\syswow64目录下. 同理,lib也需要区分是32位还是64位。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧