首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

win7 64位系统VS2012 链接DIRECTX SDK函数失误

2013-12-20 
win7 64位系统VS2012 链接DIRECTX SDK函数出错系统:win7 64位VS2012, directx sdk june 2010出错信息:引用

win7 64位系统VS2012 链接DIRECTX SDK函数出错
系统: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];// 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOMMyRegisterClass(HINSTANCE hInstance);
BOOLInitInstance(HINSTANCE, int);
LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACKAbout(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,结果都是一样的错误。
寻求解答。
[解决办法]
VS2012本来就带DirectX11啊,不用配置任何东西就应该能找到d3d9.lib(不过没有d3d9x.lib,因为现在改用DirectXMath了)

另外如果有可能的话还是直接学D3D11吧。d3d9某种意义上也算是个历史符号了。
[解决办法]
在Win64下:
64位dll在c:\windows\system32目录下;
32位dll在c:\windows\syswow64目录下.
同理,lib也需要区分是32位还是64位。
[解决办法]
项目、属性、C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项
项目、属性、链接器、附加库目录:填写附加依赖库所在目录 分号间隔多项
项目、属性、链接器(点前面的+展开)、输入、附加依赖项:填写附加依赖库的名字.lib 空格间隔多项

[解决办法]
不知道楼主的问题解决没,我今天也遇到一样的问题,也是64位系统,连接错误,后来我把附加依赖库改成x86的那个,就解决问题了。

热点排行