Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
gena_br
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 6
#1

lib библиотеки - C++

31.07.2009, 16:09. Просмотров 1660. Ответов 10
Метки нет (Все метки)

Я пишу статическую библиотеку, и в неё мне надо подключить другие стат. либы (из 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
Библиотека компилится нормально, а вот проект, где я использую свою либу, не хочет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2009, 16:09     lib библиотеки
Посмотрите здесь:

Подключение статической lib-библиотеки - C++
есть lib sqlite3.lib однако при попытке использовать функции из sqlite3.lib получаю следующее 1>msvcrt.lib(ti_inst.obj) : error...

Создание статической библиотеки lib - C++
Привет всем решил попробовать создать статическую библиотеку и связать её с каким-нибудь проектом.Для начала решил научиться, а потом...

Подключение библиотеки Glaux.lib и ошибка компиляции - C++
Здравствуйте, У меня возникла проблема - надо подключить библиотеку GLAux (OpenGL-ая). Скачал от нее .h и .lib, подключил .h через...

Как создать header для lib библиотеки? - C++
Необходимо подключить lib библиотеку к проекту. Сама библиотека получена путем перекодирования из dll утилитой implib. Необходим .h...

MinGW подключение библиотеки lib из под Windows - C++
Подскажите, как подключить библиотеку в формате lib на MinGW. Использую Windows 7 x64 + MinGW. Скачал libsndfile для windows. В наборе идут...

Ошибка при подключении библиотеки graphics и файла ресурсов libbgi.lib - C++
Собственно подключаю библиотеку и файл ресурсов к проекту, вроде бы подключается, но выдаёт ошибку вида: fatal error LNK1120:...

*.lib - C++
Написал я класс. Пусть он разбит на myClass.h и myClass.cpp. Как это все "запихнуть" в .lib? Добавлено через 12 минут ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gena_br
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 6
31.07.2009, 16:31  [ТС]     lib библиотеки #2
Цитата Сообщение от odip Посмотреть сообщение
Осталось написать какой компилятор используется
Visual C++, который в Microsoft Visual Studio 2008
gena_br
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 6
31.07.2009, 17:19  [ТС]     lib библиотеки #3
Цитата Сообщение от odip Посмотреть сообщение
То есть у тебя два проекта - библиотека и программа ?
Насколько я понимаю библиотеки DirectX нужно подключать не в проект библиотеки, а в проект программы.
Через #pragma никогда не подключал библиотеки.
Обычно в опциях в одном месте указываешь путь до каталога с библиотеками, а в другом месте - указываешь названия собственно библиотек.
Linker при сборке все находит.
Да, два проекта, либа и екзешник. Библиотеки я уже везде пробовал подключать, все равно ошибка.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.07.2009, 17:26     lib библиотеки #4
private: static struct IDirect3D9 * geGraphicsDeviceManager::m_pD3D"
А ты часом на забыл описать статический член класса в коде ?

geEngineLibrary.lib - это же твоя библиотека.
Разумеется этого статического члена нет в DirectX.

И кстати - если без библиотеки собрать, а сразу программу + исходники библиотеки - так у тебя тоже не должно получиться.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 17:28     lib библиотеки #5
Цитата Сообщение от gena_br Посмотреть сообщение
Библиотеки я уже везде пробовал подключать, все равно ошибка.
волшебные слова для Гугла:
msvc 2008 how to link static library
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.07.2009, 17:31     lib библиотеки #6
2gena_br: Cтатические библиотеки ты создавал и использовал раньше ?
gena_br
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 6
31.07.2009, 17:50  [ТС]     lib библиотеки #7
Цитата Сообщение от odip Посмотреть сообщение
А ты часом на забыл описать статический член класса в коде ?

geEngineLibrary.lib - это же твоя библиотека.
Разумеется этого статического члена нет в DirectX.

И кстати - если без библиотеки собрать, а сразу программу + исходники библиотеки - так у тебя тоже не должно получиться.
вот класс geGraphicsDeviceManager:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#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
#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;
}


Если убрать static везде всё работает. Как использовать статические члены в либе?

Цитата Сообщение от odip
2gena_br: Cтатические библиотеки ты создавал и использовал раньше ?
Нет, первый раз пишу. Я вообще в С++ можно сказать новичок. Раньше писал "движок" на C#, щас пробую перенести его на С++

Добавлено через 8 минут 12 секунд
Всем спасибо, на другом форуме подсказали, что надо и в cpp файле описывать стат члены. Добавил в cpp
C++
1
2
IDirect3D9* geGraphicsDeviceManager::m_pD3D;
IDirect3DDevice9* geGraphicsDeviceManager::m_pGraphicsDevice;
и все заработало
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.07.2009, 18:02     lib библиотеки #8
Если убрать static везде всё работает. Как использовать статические члены в либе?
Значит точно дело в этом.
Не очень разбираюсь в DirectX. Тебе точно нужны именно статические члены ?

А если нужны - то в соответствующем CPP-файле должен сделать инициализацию статических переменных.

C++
1
static IDirect3DDevice9* GetGraphicsDevice();
А вот тут мне кажется вообще static не нужен.

Добавлено через 8 минут 37 секунд
Всем спасибо, на другом форуме подсказали, что надо и в cpp файле описывать стат члены. Добавил в cpp
Хм, а пост #6 видел ?
Я там это и сказал - что нужно описать статические члены в коде.
Alexiski
Любитель давать советы
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
31.07.2009, 18:03     lib библиотеки #9
В файле, где определяются члены класса, пишем:
C++
1
2
IDirect3D9 * geGraphicsDeviceManager::m_pD3D;
IDirect3DDevice9 * geGraphicsDeviceManager::m_pGraphicsDevice;
Upd
Не, ребята, в таком темпе я за вами не успеваю
gena_br
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 6
31.07.2009, 18:18  [ТС]     lib библиотеки #10
Цитата Сообщение от odip
Хм, а пост #6 видел ?
Я там это и сказал - что нужно описать статические члены в коде.
Видел, поэтому и спросил в следующем своем посте
Цитата Сообщение от gena_br
Как использовать статические члены в либе?
Ну да ладно, проблема решена тему можно закрывать.

Кстати, так статические члены нужно везде определять? Не только в либе?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2009, 18:21     lib библиотеки
Еще ссылки по теме:

lib от PureBasic - C++
Задача: есть lib, созданная в PureBasic'e. Известны функции, количество параметров в каждой из них. Нужно написать хэдер и прикрутить к...

scrnsave.lib - C++
Привет всем, разбираю статью (как написать screensaver), там есть пример: #include <windows.h> #include <scrnsave.h> LRESULT...

Не создается файл .lib - C++
Здравствуйте, такой вопрос. VS2012 Создал консольное приложение Win32, поставил при создании - статическая библиотека. После добавил в...

Dll и Lib файлы - C++
Создаю корректный хедер и модуль, компилирую в dll. Перемещаю .h, .dll и .lib в папку с приложением, которое их использует. Почему связи...

VS C++ 2008 - kernel32.lib - C++
LINK : fatal error LNK1104: не удается открыть файл ''kernel32.lib'' Данная ошибка у меня возникает даже при компиляции чистого проекта....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
31.07.2009, 18:21     lib библиотеки #11
Кстати, так статические члены нужно везде определять? Не только в либе?
Разумеется, что библиотеки тут не при чем.
Yandex
Объявления
31.07.2009, 18:21     lib библиотеки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru