Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LNK2005 
:(
    Опции темы
OXOTHUK
Дата 8.5.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Пишу DirectDraw движок. 3 файла: с формой, stdafx.h, с классом. Во всех файлах первая строка #pragma once, во 2 всех файлах вторая строка #include "stdafx.h". В stdafx.h все файлы прописаны. Переменная класса прописана в файле с формой(код не привожу т.к. он очень болшой). Была ошибка LNK2005, мол много экземпляров есть(причем каждой функции этого класса в obj-файле с именем файла с формой). Потом как-то перестала, уж не помню как исправил. Добавил функцию в класс - и опять эта ошибка уж не знаю как исправить.

PS. Вопрос не по теме: у меня есть нескольно LPDIRECTDRAWSURFACE`ов. Все работают, рисуются, но когда вызовешь  Relesase, то вылазит ошибка. Отчего это может быть? 
PM MAIL   Вверх
DeadSoul
Дата 8.5.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



OXOTHUK, 
Цитата

Linker Tools Error LNK2005  

Error Message 
symbol already defined in object


The given symbol, displayed in its decorated form, was multiply defined.

For more information, see the Knowledge Base articles: 

"LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries" (Q148652)

"Global Overloaded Delete Operator Causes LNK2005" (Q140440)

"LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT" (Q184235).

You can find Knowledge Base articles on the MSDN Library CD-ROM or at http://support.microsoft.com/support.

This error is followed by fatal error LNK1169.

To fix by checking the following possible causes
Mixing static and dynamic libraries when also using /clr. 

The symbol is a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include symbol.

The symbol is defined differently in two member objects in different libraries, and both member objects were used.

An absolute is defined twice, with a different value in each definition.

A header file declared and defined a variable. Possible solutions include: 

Declare the variable in .h: extern BOOL MyBool; and then assign to it in a .c or .cpp file: BOOL MyBool = FALSE;.

Declare the variable static.

Declare the variable selectany.

If you use uuid.lib in combination with other .lib files that define GUIDs (for example, oledb.lib and adsiid.lib). For example: 

  Copy Code 
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
already defined in uuid.lib(go7.obj)
 

To fix, add /FORCE:MULTIPLE to the linker command line options, and make sure that uuid.lib is the first library referenced.

Что из этого прроверил? 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
OXOTHUK
Дата 9.5.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Цитата

LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries" (Q148652)

Эти вообще не подключал.
Цитата

Global Overloaded Delete Operator Causes LNK2005

Слова delete вообще в программе нет
Цитата

LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT

И new тоже
Цитата

The symbol is a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include symbol.

Rebuild не спасает
Цитата

Mixing static and dynamic libraries when also using /clr.

Из библиотек использую только ddraw.lib и atlimage.h
Цитата

The symbol is defined differently in two member objects in different libraries, and both member objects were used.

У меня всего 1 объект
Цитата

An absolute is defined twice, with a different value in each definition.

Я всего 1 раз объявлял переменную.
Цитата

Declare the variable in .h: extern BOOL MyBool; and then assign to it in a .c or .cpp file: BOOL MyBool = FALSE;.
Declare the variable static.
Declare the variable selectany.

Ничего из этого нет.
Цитата

If you use uuid.lib in combination with other .lib files that define GUIDs (for example, oledb.lib and adsiid.lib).

GUID вообще не использую.

PS. В MSDNе я тоже смотрел. 
PM MAIL   Вверх
DeadSoul
Дата 9.5.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(OXOTHUK @  9.5.2006,  10:07 Найти цитируемый пост)
Цитата
Mixing static and dynamic libraries when also using /clr.
Из библиотек использую только ddraw.lib и atlimage.h

Используешь. Ты как минимум используешь виндовые библиотеки.

Можно посмотреть на h-файл в котором декларирована данная функция?
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
OXOTHUK
Дата 10.5.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Видимо предётся весь код выкладывать:
Всё довёл до ума и получилось(добавил новый класс) итого 5 файлов:
1) Drawer.cpp (файл с окном - главный файл проекта):
Код

#pragma once

#include "stdafx.h"
#include "Drawer.h"
#define MAX_LOADSTRING 100

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);
CDrawer drawer;

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_DRAWER, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    if (!InitInstance (hInstance, nCmdShow)) return FALSE;
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = NULL;
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = (LPCTSTR)IDC_DRAWER;
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = NULL;
    return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance; 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd) return FALSE;
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   drawer.Initialize(hWnd);
   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_DESTROY:
        drawer.Close();
        PostQuitMessage(0);
        break;
    case WM_KEYDOWN:
        drawer.CheckKey(wParam);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

2) stdafx.h (заголовки):
Код

#pragma once

#define WIN32_LEAN_AND_MEAN        
#include <ddraw.h>
#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <atlimage.h>
#include "classes.h"

3) classes.h (классы движка):
Код

#pragma once

#include "stdafx.h"
#include "CBF.h"

#ifndef DRAWERCLASSES
#define DRAWERCLASSES

class CSurface;

class CDrawer
{
public:
    CDrawer();
    ~CDrawer();
    bool Initialize(HWND hwnd, int ResolX = 1024, int ResolY = 768, int BitDepth = 32);
    void Close();
    void CheckKey(UINT key);
    bool DoMessage(UINT message, UINT wParam, UINT lParam);
    bool CreateSurface(DWORD Width, DWORD Height, LPDIRECTDRAWSURFACE FAR *lpSF);
    bool DrawBuf(CSurface *SF);
private:
    LPDIRECTDRAW lpDD; //DirectDrawInterface
    LPDIRECTDRAWSURFACE lpDisplay, lpBuf, lpClear; //surfaces: display, buffer, to clear display
    DDSURFACEDESC ddsd;
    CImage pClr;
    HDC hClr;
    RECT clr;
    HWND hWnd;
};

class CSurface
{
public:
    CSurface(CDrawer *drawer, LPCTSTR FileName, bool UseColorKey = true);
    bool LoadPicture(LPCTSTR FileName);
    void SetTransparency(bool UseColorKey, DWORD Color = 0);
    DWORD GetWidth() {return Width;}
    DWORD GetHeight() {return Height;}
    void SetSrcRect(long left, long top, long right, long bottom);
    void SetDestRect(long left, long top, long right, long bottom);
    RECT* GetSrcRect() {return &rects;}
    RECT* GetDestRect() {return &rectd;}
    LPDIRECTDRAWSURFACE GetSuface() {return lpSF;}
    ~CSurface();
private:
    HDC hDC;
    CImage pic;
    LPDIRECTDRAWSURFACE lpSF;
    DDCOLORKEY ColorKey;
    DWORD Width, Height;
    RECT rectd, rects;
};

#endif

#include "CDrawer.cpp"
#include "CSurface.cpp"

4) CDrawer.cpp (файл реализации класса движка):
Код

#pragma once

#include "stdafx.h"

#ifdef DRAWERCLASSES

CDrawer::CDrawer()
{
}

CDrawer::~CDrawer()
{
}

bool CDrawer::Initialize(HWND hwnd, int ResolX, int ResolY, int BitDepth)
{
    HRESULT res;
    hWnd = hwnd;
    res = DirectDrawCreate(NULL, &lpDD, NULL);
    if (res!=DD_OK) return false;
    res = lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
    if (res!=DD_OK) return false;
    res = lpDD->SetDisplayMode(ResolX, ResolY, BitDepth);
    if (res!=DD_OK) return false;
    memset(&ddsd, 0, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    res = lpDD->CreateSurface(&ddsd, &lpDisplay, NULL);
    if (res!=DD_OK) return false;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    ddsd.dwHeight = ResolY; 
    ddsd.dwWidth = ResolX;
    res = lpDD->CreateSurface(&ddsd, &lpClear, NULL);
    if (res!=DD_OK) return false;
    res = lpDD->CreateSurface(&ddsd, &lpBuf, NULL);
    if (res!=DD_OK) return false;
    pClr.Create(ResolX, ResolY, BitDepth);
    lpClear->GetDC(&hClr);
    pClr.BitBlt(hClr, 0, 0);
    lpClear->ReleaseDC(hClr);
    clr.left = clr.top = 0;
    clr.bottom = ResolY;
    clr.right = ResolX;
    lpBuf->BltFast(0, 0, lpClear, &clr, NULL);
    lpDisplay->BltFast(0, 0, lpBuf, &clr, NULL);
    return true;
}

void CDrawer::Close()
{
    if (lpDD!=NULL) lpDD->Release();
    //if (lpDisplay!=NULL) lpDisplay->Release();
    //if (lpBuf!=NULL) lpBuf->Release();
    //if (lpClear!=NULL) lpClear->Release();
    if (pClr!=NULL) pClr.Destroy();
}

bool CDrawer::DoMessage(UINT message, UINT wParam, UINT lParam)
{
    switch (message)
    {
    case WM_KEYDOWN:
        switch(wParam)
        {
        case VK_ESCAPE:
            SendMessage(hWnd, WM_DESTROY, NULL, NULL);
            break;
        }
        break;
    }
    return true;
}

void CDrawer::CheckKey(UINT key)
{
    if (HIWORD(GetKeyState(key))!=0) DoMessage(WM_KEYDOWN, key, NULL);
}

bool CDrawer::CreateSurface(DWORD Width, DWORD Height, LPDIRECTDRAWSURFACE FAR *lpSF)
{
    ddsd.dwSize = sizeof(ddsd);
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    ddsd.dwHeight = Height; 
    ddsd.dwWidth = Width;
    HRESULT res;
    res = lpDD->CreateSurface(&ddsd, lpSF, NULL);
    if (res!=DD_OK) return false;
    else return true;
}

bool CDrawer::DrawBuf(CSurface *SF)
{
    if (SF!=NULL)
    {
        HRESULT res = lpBuf->Blt(SF->GetDestRect(), SF->GetSuface(), SF->GetSrcRect(), DDBLT_KEYSRC, NULL);
        if (res==DD_OK) return true;
        else return false;
    }
    else return false;
}

#endif

5) CSurface.cpp (файл реализации класса дополнительного):
Код

#pragma once

#include "stdafx.h"

#ifdef DRAWERCLASSES

CSurface::CSurface(CDrawer *drawer, LPCTSTR FileName, bool UseColorKey)
{
    pic.Load(FileName);
    Width = pic.GetWidth();
    Height = pic.GetHeight();
    rects.top = rects.left = 0;
    rects.bottom = Height; rects.right = Width;
    drawer->CreateSurface(Width, Height, &lpSF);
    lpSF->GetDC(&hDC);
    pic.BitBlt(hDC, 0, 0);
    lpSF->ReleaseDC(hDC);
    ColorKey.dwColorSpaceLowValue = 0;
    if (UseColorKey) lpSF->SetColorKey(DDCKEY_SRCBLT, &ColorKey);
}

CSurface::~CSurface()
{
    lpSF->Release();
    pic.Destroy();
}

bool CSurface::LoadPicture(LPCTSTR FileName)
{
    pic.Destroy();
    HRESULT res = pic.Load(FileName);
    if (res!=S_OK) return false;
    Width = pic.GetWidth();
    Height = pic.GetHeight();
    rects.top = rects.left = 0;
    rects.bottom = Height; rects.right = Width;
    lpSF->GetDC(&hDC);
    pic.BitBlt(hDC, 0, 0);
    lpSF->ReleaseDC(hDC);
    return true;
}

void CSurface::SetTransparency(bool UseColorKey, DWORD Color)
{
    ColorKey.dwColorSpaceLowValue = Color;
    lpSF->SetColorKey(DDCKEY_SRCBLT, &ColorKey);
}

void CSurface::SetSrcRect(long left, long top, long right, long bottom)
{
    rects.left = left;
    rects.top = top;
    rects.right = right;
    rects.bottom = bottom;
}

void CSurface::SetDestRect(long left, long top, long right, long bottom)
{
    rectd.left = left;
    rectd.top = top;
    rectd.right = right;
    rectd.bottom = bottom;
}

#endif


PS. А если использовать /FORCE:MULTIPLE, что от этого будет?  

Это сообщение отредактировал(а) OXOTHUK - 10.5.2006, 14:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0972 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.