DirectX编程的关于静态库的error LNK 2019问题,研究了一天了,已崩溃

哈利_蜘蛛侠 2014-07-23 12:19:19
首先声明:
1、刚刚接触建立和调用静态库,用Windows Console Application测试,没问题;
2、DirectX是2010 June版本,用的是DirectX 9;
3、各种文件放在一个工程目录下的话,没有任何问题。

好了,现在正式开始。

下面是Experiment工程的文件winmain.cpp的内容。这个工程是用来调用我即将在2楼给出的Library.lib库文件的。代码如下:

#include <windows.h>

#include "F:\\Allen Sherrod\\Chap1\\Library\\Library\\Lib.h"
//#include "Lib.h"
#pragma comment(lib, "F:\\Allen Sherrod\\Chap1\\Library\\Debug\\Library.lib")
//#pragma comment(lib, "Library.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst,
LPSTR cmdLine, int show)
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc,
0, 0, GetModuleHandle(NULL), NULL, NULL,
NULL, NULL, WINDOW_CLASS, NULL };
RegisterClassEx(&wc);

// Create the application's window
HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME,
WS_OVERLAPPEDWINDOW, 100, 100,
640, 480, GetDesktopWindow(), NULL,
wc.hInstance, NULL);

// Initialize Direct3D
if (InitializeD3D(hWnd, false))
{
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);

// Enter the message loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));

while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
RenderScene();
}
}

// Release any and all resources.
Shutdown();

// Unregister our window.
UnregisterClass(WINDOW_CLASS, wc.hInstance);
return 0;
}


可是结果编译没问题,但是debug的时候出现两个错误,第一个错误是
“error LNK 2019: unresolved external symbol _Direct3DCreate9...”(以下省去若干字)
第二个错误是
error LNK 1120: 1 unresolved externals

网上找了半天了,不过好像没有问这种跟DirectX相关的问题的。郁闷死了。
...全文
257 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
另一个是Lib.cpp:


#include "Lib.h"

// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;

// Vertex buffer to hold the geometry.
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;

LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	switch (msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;

	case WM_KEYUP:
		if (wp == VK_ESCAPE) PostQuitMessage(0);
		break;
	}

	return DefWindowProc(hWnd, msg, wp, lp);
}

bool InitializeD3D(HWND hWnd, bool fullscreen)
{
	D3DDISPLAYMODE displayMode;

	// Create the D3D object.
	g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
	if (g_D3D == NULL) return false;


	// Get the desktop display mode.
	if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
		&displayMode))) return false;


	// Set up the structure used to create the D3DDevice
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));


	if (fullscreen)
	{
		d3dpp.Windowed = FALSE;
		d3dpp.BackBufferWidth = 640;
		d3dpp.BackBufferHeight = 480;
	}
	else
		d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = displayMode.Format;


	// Create the D3DDevice
	if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
		&d3dpp, &g_D3DDevice))) return false;


	// Initialize any objects we will be displaying.
	if (!InitializeObjects()) return false;

	return true;
}

bool InitializeObjects()
{
	unsigned long col = D3DCOLOR_XRGB(255, 255, 255);

	// Fill in our structure to draw an object.
	// x, y, z, rhw, color.
	stD3DVertex objData[] =
	{
		{ 420.0f, 150.0f, 0.5f, 1.0f, col, },
		{ 420.0f, 350.0f, 0.5f, 1.0f, col, },
		{ 220.0f, 150.0f, 0.5f, 1.0f, col, },
		{ 220.0f, 350.0f, 0.5f, 1.0f, col, },
	};

	// Create the vertex buffer.
	if (FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
		D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
		NULL))) return false;

	// Fill the vertex buffer.
	void *ptr;

	if (FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
		(void**)&ptr, 0))) return false;

	memcpy(ptr, objData, sizeof(objData));

	g_VertexBuffer->Unlock();

	return true;
}


void RenderScene()
{
	// Clear the backbuffer.
	g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
		D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

	// Begin the scene.  Start rendering.
	g_D3DDevice->BeginScene();

	// Render object.
	g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
		sizeof(stD3DVertex));
	g_D3DDevice->SetFVF(D3DFVF_VERTEX);
	g_D3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 2);

	// End the scene.  Stop rendering.
	g_D3DDevice->EndScene();

	// Display the scene.
	g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}


void Shutdown()
{
	if (g_D3DDevice != NULL) g_D3DDevice->Release();
	if (g_D3D != NULL) g_D3D->Release();
	if (g_VertexBuffer != NULL) g_VertexBuffer->Release();

	g_D3DDevice = NULL;
	g_D3D = NULL;
	g_VertexBuffer = NULL;
}
Build Solution后就会生成一个叫做Library.lib的静态库文件(在Debug文件夹中)。
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
1楼给的是一个普通的Win32项目。下面这个项目叫做Library,是一个Static Library项目,分成两个文件,一个是lib.h:


#ifndef LIB_H
#define LIB_H

#include<d3d9.h>
#include<d3dx9.h>

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

const char* WINDOW_CLASS = "UGPDX";
const char* WINDOW_NAME = "Drawing Lines";

// Function Prototypes...
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();

// A structure for our custom vertex type
struct stD3DVertex
{
	float x, y, z, rhw;
	unsigned long color;
};

// Our custom FVF, which describes our custom vertex structure.
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

#endif
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
引用 5 楼 mrlgy 的回复:
是不是属性-》链接器-》输入-》附加依赖性添加Library.lib,试试看
你有DirectX的话可以自己试试,成功了的话告诉我,然后我把分都给你。拜托了!
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
引用 5 楼 mrlgy 的回复:
是不是属性-》链接器-》输入-》附加依赖性添加Library.lib,试试看
那个和我在winmain.cpp一开始的#pragma comment语句不是等效的吗?而且我也试过了,反正能想到的方法都试过了。
mrlgy 2014-07-23
  • 打赏
  • 举报
回复
是不是属性-》链接器-》输入-》附加依赖性添加Library.lib,试试看
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
引用 3 楼 mrlgy 的回复:
感觉编译main那个工程的时候libray还没有编译,是先编译的libray那个工程嘛?如果两个工程在一个解决方案可以手动选择先编译libray工程;还有个依赖性设置了也可以直接编译
当然Library已经编译了呀,否则那个lib文件怎么出来呢?我用控制台程序做过小实验,没问题的,但是到了这个Win 32程序的话就各种问题了,还找不到原因。我怀疑是编译Library工程的时候没有弄好,但是除了Build Solution以外还有其他方法吗?
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
引用 10 楼 supersayess 的回复:
你确定在同一个工程目录下运行的话是没有问题的吗?仔细检查你的各项设定,包括包含的DirectX的头文件和库文件的目录等。
好的,真是多谢你了,问题解决了!主要是两个问题: 1、在项目属性里添加DirectX的lib文件夹目录时,要选择x86,而不是x64,即使你是64位系统; 2、在头文件中尽量不要出现常量的完整定义,完整定义要写在其对应的cpp文件中,头文件中前面加一个extern。
虚空梦影 2014-07-23
  • 打赏
  • 举报
回复
引用 8 楼 u011873969 的回复:
对了,之前在项目属性里包含的DirectX的lib文件的库文件夹是x64的,刚才我改成了x86,然后突然可以运行了!但是运行时发现字符显示有问题,就是英文显示成了乱码。于是我将Lib.h中开始的那个字符串类型改成了 const wchar_t*(字符串前面还加了一个L),然后把两个项目属性的字符集改成了Unicode。本以为这下子没问题了,但是运行的时候却又出现了新问题: 这到底是怎么回事呢?
至于这个问题,可能是头文件中的const的问题吧,你在这方面下个功夫。
虚空梦影 2014-07-23
  • 打赏
  • 举报
回复
你确定在同一个工程目录下运行的话是没有问题的吗?仔细检查你的各项设定,包括包含的DirectX的头文件和库文件的目录等。
赵4老师 2014-07-23
  • 打赏
  • 举报
回复
重建所有。 或 const wchar_t *XXX=L"..."; 改为 wchar_t XXX[]=L"..."; 再试试?
哈利_蜘蛛侠 2014-07-23
  • 打赏
  • 举报
回复
对了,之前在项目属性里包含的DirectX的lib文件的库文件夹是x64的,刚才我改成了x86,然后突然可以运行了!但是运行时发现字符显示有问题,就是英文显示成了乱码。于是我将Lib.h中开始的那个字符串类型改成了 const wchar_t*(字符串前面还加了一个L),然后把两个项目属性的字符集改成了Unicode。本以为这下子没问题了,但是运行的时候却又出现了新问题:


这到底是怎么回事呢?
mrlgy 2014-07-23
  • 打赏
  • 举报
回复
感觉编译main那个工程的时候libray还没有编译,是先编译的libray那个工程嘛?如果两个工程在一个解决方案可以手动选择先编译libray工程;还有个依赖性设置了也可以直接编译

64,642

社区成员

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

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