lib библиотеки
От: Аноним  
Дата: 31.07.09 12:23
Оценка:
Я пишу статическую библиотеку, и в неё мне надо подключить другие стат. либы (из DirectX SDK). Как их подключить?
Пробовал через #pragma comment(lib, "имя библиотеки"), но когда в другом проекте я подключаю свою библиотеку, при компиляции линковщик ругается на переменные и функции DirectX.
В обычном win32 exe приложении я подключал через свойства проекта>linker>input> и там писал имя библиотек. Но в свойстве стат. либы проекта такого пункта нету. Или через #pragma comment и все норм работало.

Error 1 error LNK2001: unresolved external symbol "private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D" (?m_pD3D@geGraphicsDeviceManager@@0PAUIDirect3D9@@A) geEngineLibrary.lib geEngineProject
Error 2 error LNK2001: unresolved external symbol "private: static struct IDirect3DDevice9 * geGraphicsDeviceManager::m_pGraphicsDevice" (?m_pGraphicsDevice@geGraphicsDeviceManager@@0PAUIDirect3DDevice9@@A) geEngineLibrary.lib geEngineProject
Error 3 fatal error LNK1120: 2 unresolved externals E:\Work\Project\CPP\geEngineProject\Debug\geEngineProject.exe 1 geEngineProject
Библиотека компилится нормально, а вот проект, где я использую свою либу, не хочет
lib linker библиотеки с++
Re: lib библиотеки
От: Ovl Россия  
Дата: 31.07.09 12:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я пишу статическую библиотеку, и в неё мне надо подключить другие стат. либы (из DirectX SDK). Как их подключить?

А>Пробовал через #pragma comment(lib, "имя библиотеки"), но когда в другом проекте я подключаю свою библиотеку, при компиляции линковщик ругается на переменные и функции DirectX.
А>В обычном win32 exe приложении я подключал через свойства проекта>linker>input> и там писал имя библиотек. Но в свойстве стат. либы проекта такого пункта нету. Или через #pragma comment и все норм работало.

А>Error 1 error LNK2001: unresolved external symbol "private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D" (?m_pD3D@geGraphicsDeviceManager@@0PAUIDirect3D9@@A) geEngineLibrary.lib geEngineProject

А>Error 2 error LNK2001: unresolved external symbol "private: static struct IDirect3DDevice9 * geGraphicsDeviceManager::m_pGraphicsDevice" (?m_pGraphicsDevice@geGraphicsDeviceManager@@0PAUIDirect3DDevice9@@A) geEngineLibrary.lib geEngineProject
А>Error 3 fatal error LNK1120: 2 unresolved externals E:\Work\Project\CPP\geEngineProject\Debug\geEngineProject.exe 1 geEngineProject
А>Библиотека компилится нормально, а вот проект, где я использую свою либу, не хочет

не будет такого. окончательная линковка происходит в exe или dll.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: lib библиотеки
От: Аноним  
Дата: 31.07.09 12:36
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>Здравствуйте, Аноним, Вы писали:


А>>Я пишу статическую библиотеку, и в неё мне надо подключить другие стат. либы (из DirectX SDK). Как их подключить?

А>>Пробовал через #pragma comment(lib, "имя библиотеки"), но когда в другом проекте я подключаю свою библиотеку, при компиляции линковщик ругается на переменные и функции DirectX.
А>>В обычном win32 exe приложении я подключал через свойства проекта>linker>input> и там писал имя библиотек. Но в свойстве стат. либы проекта такого пункта нету. Или через #pragma comment и все норм работало.

А>>Error 1 error LNK2001: unresolved external symbol "private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D" (?m_pD3D@geGraphicsDeviceManager@@0PAUIDirect3D9@@A) geEngineLibrary.lib geEngineProject

А>>Error 2 error LNK2001: unresolved external symbol "private: static struct IDirect3DDevice9 * geGraphicsDeviceManager::m_pGraphicsDevice" (?m_pGraphicsDevice@geGraphicsDeviceManager@@0PAUIDirect3DDevice9@@A) geEngineLibrary.lib geEngineProject
А>>Error 3 fatal error LNK1120: 2 unresolved externals E:\Work\Project\CPP\geEngineProject\Debug\geEngineProject.exe 1 geEngineProject
А>>Библиотека компилится нормально, а вот проект, где я использую свою либу, не хочет

Ovl>не будет такого. окончательная линковка происходит в exe или dll.
Re[3]: lib библиотеки
От: gena_br  
Дата: 31.07.09 12:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Ovl>>не будет такого. окончательная линковка происходит в exe или dll.


Как сделать чтоб всё нормально линковалось? Как и куда подключать либы?
Re: lib библиотеки
От: cencio Украина http://ua-coder.blogspot.com
Дата: 31.07.09 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:
>>private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D

geGraphicsDeviceManager это из твоего движка? либу движка к екзешнику прилинковал? или забыл определись geGraphicsDeviceManager::m_pD3D в самой либе?
avalon 1.0rc2 rev 275
Re[2]: lib библиотеки
От: gena_br  
Дата: 31.07.09 13:14
Оценка:
Здравствуйте, cencio, Вы писали:

C>Здравствуйте, Аноним, Вы писали:

>>>private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D

C>geGraphicsDeviceManager это из твоего движка? либу движка к екзешнику прилинковал? или забыл определись geGraphicsDeviceManager::m_pD3D в самой либе?


Да, geGraphicsDeviceManager из моей либы. Либу к экзешнику прилинковал, в либе есть ещё класс таймера, он в екзешнике работает нормально.

Вот класс geGraphicsDeviceManager:
geGraphicsDeviceManager.h
#ifndef _GRAPHICSDEVICEMANAGER_H
#define _GRAPHICSDEVICEMANAGER_H

#include "d3d9.h"

class geGraphicsDeviceManager
{
private:
static IDirect3D9 *m_pD3D;
static IDirect3DDevice9 *m_pGraphicsDevice;
D3DPRESENT_PARAMETERS m_d3dpp;

public:
geGraphicsDeviceManager(void);
~geGraphicsDeviceManager(void);

static IDirect3DDevice9* GetGraphicsDevice();
HRESULT CreateDevice(IDirect3DDevice9** ppGraphicsDevice, HWND hWnd,
int width, int height, bool fullscreen);
};
#endif

geGraphicsDeviceManager.cpp
#include "StdAfx.h"
#include "geGraphicsDeviceManager.h"

geGraphicsDeviceManager::geGraphicsDeviceManager(void)
{
}

geGraphicsDeviceManager::~geGraphicsDeviceManager(void)
{
if (m_pGraphicsDevice)
{
m_pGraphicsDevice->Release();
m_pGraphicsDevice = NULL;
}
if (m_pD3D)
{
m_pD3D->Release();
m_pD3D = NULL;
}
}

IDirect3DDevice9* geGraphicsDeviceManager::GetGraphicsDevice()
{
return m_pGraphicsDevice;
}

HRESULT geGraphicsDeviceManager::CreateDevice(IDirect3DDevice9** ppGraphicsDevice,
HWND hWnd, int width, int height, bool fullscreen)
{
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (!m_pD3D) return E_FAIL;

ZeroMemory(&m_d3dpp, sizeof(D3DPRESENT_PARAMETERS));
m_d3dpp.BackBufferWidth = width;
m_d3dpp.BackBufferHeight = height;
m_d3dpp.EnableAutoDepthStencil = TRUE;
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

if (fullscreen)
{
m_d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
m_d3dpp.Windowed = false;
m_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
}
else
{
RECT wndRect;
RECT clientRect;

GetWindowRect(hWnd, &wndRect);
GetClientRect(hWnd, &clientRect);

int WndWidth = width + ((wndRect.right — wndRect.left) — clientRect.right);
int WndHeight = height + ((wndRect.bottom — wndRect.top) — clientRect.bottom);

MoveWindow(hWnd, wndRect.left, wndRect.top, WndWidth, WndHeight, TRUE);

D3DDISPLAYMODE d3ddm;
m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);

m_d3dpp.BackBufferFormat = d3ddm.Format;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.Windowed = TRUE;
}

DWORD flags = D3DCREATE_MIXED_VERTEXPROCESSING;

HRESULT hRes;
hRes = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, flags,
&m_d3dpp, ppGraphicsDevice);
if(FAILED(hRes)) return hRes;

m_pGraphicsDevice = *ppGraphicsDevice;

m_pGraphicsDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

return S_OK;
}
Re[3]: lib библиотеки
От: cencio Украина http://ua-coder.blogspot.com
Дата: 31.07.09 13:37
Оценка: 3 (1)
Здравствуйте, gena_br, Вы писали:

g> >>>private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D


g> C>geGraphicsDeviceManager это из твоего движка? либу движка к екзешнику прилинковал? или забыл определись geGraphicsDeviceManager::m_pD3D в самой либе?


g> Да, geGraphicsDeviceManager из моей либы. Либу к экзешнику прилинковал, в либе есть ещё класс таймера, он в екзешнике работает нормально.


g> Вот класс geGraphicsDeviceManager:


а где в cpp файле определяются m_pD3D и m_pGraphicsDevice ?

добавь в начало спп файла:

IDirect3D9* geGraphicsDeviceManager::m_pD3D;
IDirect3DDevice9* geGraphicsDeviceManager::m_pGraphicsDevice;

как раз их и не может линкер знайти
avalon 1.0rc2 rev 275
Re[4]: lib библиотеки
От: gena_br  
Дата: 31.07.09 13:47
Оценка:
Здравствуйте, cencio, Вы писали:

C>Здравствуйте, gena_br, Вы писали:


g>> >>>private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D


g>> C>geGraphicsDeviceManager это из твоего движка? либу движка к екзешнику прилинковал? или забыл определись geGraphicsDeviceManager::m_pD3D в самой либе?


g>> Да, geGraphicsDeviceManager из моей либы. Либу к экзешнику прилинковал, в либе есть ещё класс таймера, он в екзешнике работает нормально.


g>> Вот класс geGraphicsDeviceManager:


C>а где в cpp файле определяются m_pD3D и m_pGraphicsDevice ?


C>добавь в начало спп файла:


C>IDirect3D9* geGraphicsDeviceManager::m_pD3D;

C>IDirect3DDevice9* geGraphicsDeviceManager::m_pGraphicsDevice;

C>как раз их и не может линкер знайти


Большое спасибо! Все заработало!
Так все статические члены надо описывать(в .h и .cpp) в либе?
Re[5]: lib библиотеки
От: cencio Украина http://ua-coder.blogspot.com
Дата: 31.07.09 14:45
Оценка:
Здравствуйте, gena_br, Вы писали:

g> g>> >>>private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D


g> g>> C>geGraphicsDeviceManager это из твоего движка? либу движка к екзешнику прилинковал? или забыл определись geGraphicsDeviceManager::m_pD3D в самой либе?


g> g>> Да, geGraphicsDeviceManager из моей либы. Либу к экзешнику прилинковал, в либе есть ещё класс таймера, он в екзешнике работает нормально.


g> g>> Вот класс geGraphicsDeviceManager:


g> C>а где в cpp файле определяются m_pD3D и m_pGraphicsDevice ?


g> C>добавь в начало спп файла:


g> C>IDirect3D9* geGraphicsDeviceManager::m_pD3D;

g> C>IDirect3DDevice9* geGraphicsDeviceManager::m_pGraphicsDevice;

g> C>как раз их и не может линкер знайти


g> Большое спасибо! Все заработало!

g> Так все статические члены надо описывать(в .h и .cpp) в либе?

либа тут не при чем, если попробуеш длл или екзешку делать вместо нее получиш такую-же ошибку. просто почитай как правильно поределять статические переменные — члены класса.
avalon 1.0rc2 rev 275
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.