На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser, Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Не работает метод SDL_Init библиотеки SDL
    Я выполнила все условия из этого видео https://www.youtube.com/watch?v=QQzAHcojEKg по подключении библиотеки SDL однако при вызове некоторых методов выдаёт ошибку вот код:
    Game.hpp
    ExpandedWrap disabled
      #ifndef Game_hpp
      #define Game_hpp
      #include "SDL.h"
      #include <stdio.h>
       
      class Game{
      public: Game();
               ~Game();
           void init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
           void handleEvents();
           void update();
           void render();
           void clean();
           bool running() {return isRunning;}
      private:
          bool isRunning;
          SDL_Window *window;
          SDL_Renderer *renderer;
       
       
      };
      #endif

    Game.cpp <- здесь выдаёт ошибку SDL_Init

    ExpandedWrap disabled
      #include "stdafx.h"
      #include <iostream>
      #include "Game.hpp"
       
       
       
      Game::Game()
      {}
      Game::~Game()
      {}
      void Game::init(const char *title, int xpos, int ypos, int width, int height, bool fullscreen)
      {
          if(SDL_Init(SDL_INIT_EVERYTHING)==0)
          {
              std::cout << "Subsystems Initialised!..." << std::endl;
          }
      }
      void Game::handleEvents()
      {}
      void Game::update()
      {}
      void Game::render()
      {}
      void Game::clean()
      {}

    GameRPG.cpp
    ExpandedWrap disabled
      // GameRPG.cpp: главный файл проекта.
       
      #include "stdafx.h"
       
      using namespace System;
       
      int main(int argc, const char * argv[])
      {
          
      }

    Суть ошибки
    Цитата

    1>Game.obj : error LNK2028: ссылка на неразрешенную лексему (0A000312) "extern "C" int __cdecl SDL_Init(unsigned int)" (?SDL_Init@@$$J0YAHI@Z) в функции "public: void __thiscall Game::init(char const *,int,int,int,int,bool)" (?init@Game@@$$FQAEXPBDHHHH_N@Z)
    1>Game.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" int __cdecl SDL_Init(unsigned int)" (?SDL_Init@@$$J0YAHI@Z) в функции "public: void __thiscall Game::init(char const *,int,int,int,int,bool)" (?init@Game@@$$FQAEXPBDHHHH_N@Z)
      Немножко в сторону, но пишут...:
      ExpandedWrap disabled
        bool init()
        {
            //Initialize all SDL subsystems
            if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
            {
                return false;
            }
      И вообще, там SDL есть разных версий; было качественное изменение в LIB'ах с версии 1.xxx ко второй. Проверьте, какую используете. :blush:

      Добавлено
      П.С. в самих *.h-файлах нет ничего про компоновку *.lib-файлов, а у вас проблему выдаёт компоновщик. Пропишите сами добавку SDL.lib где-то в настройках.
        Цитата
        И вообще, там SDL есть разных версий; было качественное изменение в LIB'ах с версии 1.xxx ко второй. Проверьте, какую используете.


        Я поставила, эту версию http://libsdl.org/download-2.0.php
        user posted image.
        У меня Visual C++ 2008 года. Эта версия SDL совместима с моей версией программы?
        Сообщение отредактировано: Katerina1993 -
          Конечно. Библиотеки укажите в проекте (ну или строчку добавьте:
          ExpandedWrap disabled
            #pragma comment( lib, "SDL.lib" )

          )
            Всё равно не работает. Сейчас я пошагово опишу свои действия. Настройки и запуск первой программы.
            Создаю новый проект
            Файл создать Visual c++ Консольное приложение CLR.
            Заменяю код
            ExpandedWrap disabled
              // awdsdw.cpp: главный файл проекта.
               
              #include "stdafx.h"
               
              using namespace System;
               
              int main(array<System::String ^> ^args)
              {
                  Console::WriteLine(L"Здравствуй, мир!");
                  return 0;
              }

            на
            ExpandedWrap disabled
              #include "stdafx.h"
               
               
              using namespace System;
               
              int main(int argc, char *argv[])
              {
               
              return 0;
              }

            Делаю настройки
            1. Проект->свойство
            2. С/C++ Общие->Дополнительные каталоги включения->C:\SDL2\include
            3. Компоновщик->Общие->Дополнительные каталоги библиотек->C:\SDL2\lib\x64
            4. Компоновщик->Ввод
            SDL2.lib
            SDL2main.lib
            5. Система->Подсистема->Консоль (/SUBSYSTEM:CONSOLE)
            6. Перехожу в эту папку (C:\SDL2\lib\x64) беру файл SDL2.dll и копирую в папку с файлом проекта (для надёжности ещё в несколько папок включая главный проект).

            Да кстати в коде
            ExpandedWrap disabled
              #pragma comment( lib, "SDL.lib")

            ошибка раз библиотека SDL2.lib, то и подключать надо SDL2.lib. Вот так:
            ExpandedWrap disabled
              #pragma comment( lib, "SDL2.lib")

            Создаю тестовый код из видео урока.

            ExpandedWrap disabled
              // test_sdl.cpp: главный файл проекта.
               
              #include "stdafx.h"
              #include "SDL.h"
              #pragma comment( lib, "SDL2.lib")
               
              using namespace System;
               
              int main(int argc, char *argv[])
              {
                  SDL_Init(SDL_INIT_EVERYTHING);
                  SDL_Window *window = SDL_CreateWindow("title",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,600,400,SDL_WINDOW_SHOWN);
                  SDL_Renderer *renderer = SDL_CreateRenderer(window,-1,0);
                  SDL_SetRenderDrawColor(renderer,0,255,0,255);
                  SDL_RenderClear(renderer);
                  SDL_RenderPresent(renderer);
                  SDL_Delay(3000);
               
                  return 0;
              }


            Выдаёт следующие ошибки. Самое интересное, что при написании кода, если нажать CTRL-Space для вызова подсказок (методов и свойств). Все методы которые начинаются с префикса SDL корректно отображаются, но почему-то всё равно не работает.
            Цитата

            1>test_sdl.obj : warning LNK4248: неразрешенная лексема TypeRef (01000011) для "SDL_Renderer"; образ нельзя запустить
            1>test_sdl.obj : warning LNK4248: неразрешенная лексема TypeRef (01000012) для "SDL_Window"; образ нельзя запустить
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A00007F) "extern "C" void __cdecl SDL_Delay(unsigned int)" (?SDL_Delay@@$$J0YAXI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A000080) "extern "C" void __cdecl SDL_RenderPresent(struct SDL_Renderer *)" (?SDL_RenderPresent@@$$J0YAXPAUSDL_Renderer@@@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A000081) "extern "C" int __cdecl SDL_RenderClear(struct SDL_Renderer *)" (?SDL_RenderClear@@$$J0YAHPAUSDL_Renderer@@@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A000082) "extern "C" int __cdecl SDL_SetRenderDrawColor(struct SDL_Renderer *,unsigned char,unsigned char,unsigned char,unsigned char)" (?SDL_SetRenderDrawColor@@$$J0YAHPAUSDL_Renderer@@EEEE@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A000083) "extern "C" struct SDL_Renderer * __cdecl SDL_CreateRenderer(struct SDL_Window *,int,unsigned int)" (?SDL_CreateRenderer@@$$J0YAPAUSDL_Renderer@@PAUSDL_Window@@HI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A000084) "extern "C" struct SDL_Window * __cdecl SDL_CreateWindow(char const *,int,int,int,int,unsigned int)" (?SDL_CreateWindow@@$$J0YAPAUSDL_Window@@PBDHHHHI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2028: ссылка на неразрешенную лексему (0A000085) "extern "C" int __cdecl SDL_Init(unsigned int)" (?SDL_Init@@$$J0YAHI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" void __cdecl SDL_Delay(unsigned int)" (?SDL_Delay@@$$J0YAXI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" void __cdecl SDL_RenderPresent(struct SDL_Renderer *)" (?SDL_RenderPresent@@$$J0YAXPAUSDL_Renderer@@@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" int __cdecl SDL_RenderClear(struct SDL_Renderer *)" (?SDL_RenderClear@@$$J0YAHPAUSDL_Renderer@@@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" int __cdecl SDL_SetRenderDrawColor(struct SDL_Renderer *,unsigned char,unsigned char,unsigned char,unsigned char)" (?SDL_SetRenderDrawColor@@$$J0YAHPAUSDL_Renderer@@EEEE@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" struct SDL_Renderer * __cdecl SDL_CreateRenderer(struct SDL_Window *,int,unsigned int)" (?SDL_CreateRenderer@@$$J0YAPAUSDL_Renderer@@PAUSDL_Window@@HI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" struct SDL_Window * __cdecl SDL_CreateWindow(char const *,int,int,int,int,unsigned int)" (?SDL_CreateWindow@@$$J0YAPAUSDL_Window@@PBDHHHHI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            1>test_sdl.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" int __cdecl SDL_Init(unsigned int)" (?SDL_Init@@$$J0YAHI@Z) в функции "extern "C" int __cdecl SDL_main(int,char * * const)" (?SDL_main@@$$J0YAHHQAPAD@Z)
            Сообщение отредактировано: Katerina1993 -
              Эм-м-м... думаю все косяки начинаются от "консольности CLR".
              Попробуйте для начала такие действия:
              1. Создайте консольное для Win32 (потом можно будет поколдовать как переделать для универсума).
              2. Уберите все вызовы SDL'а, кроме Init'а (с него бы начать, попробовать собрать).
              ;)
                Другая теперь ошибка, создаю проект Win32 консольное приложение, даже подключила дополнительные библиотеки.
                Цитата

                win32->Консольное приложение Win32
                Далее->готово (всё оставила по умолчанию)

                ExpandedWrap disabled
                  // firstsdl.cpp: определяет точку входа для консольного приложения.
                  //
                  #pragma comment(lib, "SDL2main.lib")
                  #pragma comment(lib, "SDL2.lib")
                  #pragma comment(lib, "SDL2test.lib")
                   
                  #include "stdafx.h"
                  #include<conio.h>
                   
                  #include <stdlib.h>
                  #include <SDL.h>
                   
                  #pragma comment( lib, "SDL2.lib")
                  //using namespace System;
                   
                  int _tmain(int argc, _TCHAR* argv[])
                  {
                      //SDL_Init();
                      SDL_Init(SDL_INIT_EVERYTHING);
                      getch();
                      return 0;
                      
                  }

                Цитата
                error LNK2019: ссылка на неразрешенный внешний символ _SDL_Init в функции _wmain


                Решила попробовать Win32->проект win32 произвела все настройки и добавила код в том месте где рекомендуют добавить код:
                ExpandedWrap disabled
                  ...
                  // TODO: разместите код здесь.
                  SDL_Init(SDL_INIT_EVERYTHING);
                   
                  MSG msg;
                  HACCEL hAccelTable;
                  ...

                Ошибка:
                Цитата

                error LNK2019: ссылка на неразрешенный внешний символ _SDL_Init в функции _wWinMain@16
                  Надо же SDL.H в двойных кавычках брать(в include), а не в угловых скобках. :)
                  П.С. не уверен, что это принципиально, впрочем.
                    Вообще-то ошибка происходит на стадии линковки, так что SDL.H нормально подключился (во что бы он ни был заключён в #unclude).
                    А линковщик жалуется, что библиотека, в которой функции SDL находятся, к проекту не подключена.
                    Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                      тут есть пример
                      Может оказаться полезным такое мероприятие:
                      www.ya.ru, ищем "sdl2 c++"
                      Сообщение отредактировано: ЫукпШ -
                      Подпись была выключена в связи с наложенным заземлением.
                        Кажется работает, пока сама не поняла. Видимо была не совместимость версии (нужна SDL-devel-1.2.14-VC8) вот откуда я брала пример Прикручиваем SDL к Visual Studio 2008. Вот ещё видео с youtube. vs2008-sdl-helloworld.
                        Теперь мне интересно как запустить так, чтобы отображался printf? Сборку я делала в ручную руководствуясь видео с youtube, т.е. я создала windows проект->пустой проект, а сам пример c ЖЖ. Там если перейти по первой ссылки то там вывод на экран происходит через printf. У меня не чего не выводится просто компилируется запускается экран мигает и всё, как вывести printf?
                        Сообщение отредактировано: Katerina1993 -
                          Цитата Katerina1993 @
                          У меня не чего не выводится просто компилируется запускается экран мигает и всё, как вывести printf?

                          Если запускается консоль и тут же пропадает. Тогда это просто окно консоли закрывается и ты не успеваешь увидеть надписи. Нужно либо запускать по Ctrl+F5(запуск без отладки). Либо запускать в консоли любой(cmd, far,...), либо добавить паузу/задержку перед выходом из программы. (Ну или как вариант бесконечный цикл выход которого нажатие любой клавиши например.).
                            Цитата Katerina1993 @
                            У меня не чего не выводится просто компилируется запускается экран мигает и всё, как вывести printf?

                            printf - это вывод в консольное окно.
                            А библиотека мастерит графическое окошко.
                            Поэтому никак.
                            А для каких целей нужен printf ?
                            Подпись была выключена в связи с наложенным заземлением.
                              Цитата ЫукпШ @
                              printf - это вывод в консольное окно.
                              А библиотека мастерит графическое окошко.
                              Поэтому никак.
                              Натыкался как-то на элементарные примеры (SDL или нет - не помню) когда программа создаёт обычное граф. окно, а вывод продолжает вываливаться в оставшееся консольное. Может сударыне именно такое нужно?! Бывает такое, надо поискать. :blush:

                              Добавлено
                              Во, нашёл! Это в glut'е было:
                              ExpandedWrap disabled
                                int main ( int argc, char * argv [] )
                                {
                                    // initialize glut
                                    glutInit            ( &argc, argv );
                                    glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
                                    glutInitWindowSize  ( 500, 500 );
                                 
                                    // prepare context for 3.3
                                    glutInitContextVersion ( 3, 3 );
                                    glutInitContextFlags   ( GLUT_FORWARD_COMPATIBLE | GLUT_DEBUG );
                                    glutInitContextProfile ( GLUT_CORE_PROFILE );
                                 
                                    // create window
                                    glutCreateWindow ( "Geometry shader example - particles" );
                                 
                                    glewExperimental = GL_TRUE;
                                 
                                    glewInit ();
                                 
                                    if ( !GLEW_VERSION_3_3 )
                                    {
                                        printf ( "OpenGL 3.3 not supported.\n" );
                                        
                                        return 1;
                                    }
                                 
                                                                // register handlers
                                    glutDisplayFunc  ( display );
                                    glutReshapeFunc  ( reshape );
                                    glutKeyboardFunc ( key     );
                                    glutMouseFunc    ( mouse   );
                                    glutMotionFunc   ( motion  );
                                 
                                    if ( !GL_ARB_vertex_array_object )
                                        printf ( "No VAO support\n" );
                                 
                                    printf ( "GLSL Version: %s\n", Program::version().c_str () ); // вывод сыпется в консоль, хоть создано и граф. окно!
                                ...
                                У меня опять, что-то не получается отобразить графику. Есть ли какая-нибудь книга по SDL и Visual C++ 2008?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1534 ]   [ 15 queries used ]   [ Generated: 26.05.19, 23:58 GMT ]