C++ Einrichtung SDL2 und OpenCL 1.2

F

Furtano

Gast
Hallo,

ich möchte für ein Projekt SDL2 und OpenCL 1.2 zusammen verwenden.
Ich nutze Visual Studio 2012 Professional (32 bit).

Wenn ich SDL2 als eigenes Projekt, und OpenCL als eigenes Projekt erstelle kompiliert beides problemlos.
Aber wenn ich beides in einem Projekt vereinigen will bekomme ich folgende Fehlermeldung:

PHP:
1>------ Build started: Project: SDL1, Configuration: Debug Win32 ------
1>  Source.cpp
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\cl\cl.hpp(5434): error C2719: 'fillColor': formal parameter with __declspec(align('16')) won't be aligned
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\cl\cl.hpp(5468): error C2719: 'fillColor': formal parameter with __declspec(align('16')) won't be aligned
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\cl\cl.hpp(5502): error C2719: 'fillColor': formal parameter with __declspec(align('16')) won't be aligned
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


PHP:
#include <SDL.h>
#include <CL\cl.hpp>

int main(int argc, char** argv){
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Quit();
 
    return 0;
}

Ich freue mich auf eure hilfe :)
LG,
Furtano
 
Da wird wohl ein SDL-Header irgendwelche blöden Präprozessor-Symbole definiert haben, die es in einem OpenCL-Header auch gibt, und dann kollidieren die miteinander. Kannst du mal den Inhalt einer der vom Compiler bemängelten Zeilen posten?
 
PHP:
	4	IntelliSense: member "cl::detail::Wrapper<cl_device_id>::object_" (declared at line 1783 of "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp") is inaccessible	c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp	1815
	5	IntelliSense: member "cl::detail::Wrapper<cl_device_id>::object_" (declared at line 1783 of "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp") is inaccessible	c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp	1823
	6	IntelliSense: member "cl::detail::Wrapper<cl_device_id>::referenceCountable_" (declared at line 1784 of "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp") is inaccessible	c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp	1824
	7	IntelliSense: identifier "__CREATE_GL_BUFFER_ERR" is undefined	c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp	3342
	8	IntelliSense: identifier "__GET_GL_OBJECT_INFO_ERR" is undefined	c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\CL\cl.hpp	3392
Error	1	error C2719: 'fillColor': formal parameter with __declspec(align('16')) won't be aligned	c:\program files (x86)\microsoft visual studio 11.0\vc\include\cl\cl.hpp	5593
Error	2	error C2719: 'fillColor': formal parameter with __declspec(align('16')) won't be aligned	c:\program files (x86)\microsoft visual studio 11.0\vc\include\cl\cl.hpp	5627
Error	3	error C2719: 'fillColor': formal parameter with __declspec(align('16')) won't be aligned	c:\program files (x86)\microsoft visual studio 11.0\vc\include\cl\cl.hpp	5661
 
Hancock schrieb:
Ich denk, antred hat recht, versuch mal, die includes zu vertauschen.

Könnte klappen, aber ich befürchte fast, dann verpestet nicht mehr SDL die Umgebung von OpenCL sondern anders herum.
 
Hancock du lagst goldrichtig, jetzt geht es ohne Fehler auszuführen nachdem ich die includes vertauscht habe! Danke dir :)
Ich hoffe in Zukunft treten dadurch jetzt nicht noch weitere unerwartete Probleme auf.
Warum ist die Reihenfolge so wichtig, ich dachte das sei egal?
 
Wenn beide Bibliotheken richtig programmiert wären, wäre es kein Problem, WENN...

Beispiel:
Code:
// inc1.h
#ifndef MYDEF
#define MYDEF red
#endif
#undef MYDEF

#if MYDEF != red
#error "wrong define"
#endif
//-----

//inc2.h
#define MYDEF green
//-----

#include <inc1.h>
#include <inc2.h> //OK

#include <inc2.h>
#include <inc1.h> //error "wrong define" (weil MYDEF green ist)
 
Ah ok verstehe, schade dass es bei solch großen Bibliotheken solche Startschwierigkeiten eingebaut werden.
 
Die SDL ist da eh geil - überprüf beispielsweise mal, was mit deiner main-Funktion passiert :D
 
Hancock schrieb:
Wenn beide Bibliotheken richtig programmiert wären, wäre es kein Problem, WENN...

Beispiel:
Code:
// inc1.h
#ifndef MYDEF
#define MYDEF red
#endif
#undef MYDEF

#if MYDEF != red
#error "wrong define"
#endif
//-----

//inc2.h
#define MYDEF green
//-----

#include <inc1.h>
#include <inc2.h> //OK

#include <inc2.h>
#include <inc1.h> //error "wrong define" (weil MYDEF green ist)

Ich habe mir angewöhnt 1. auf Präprozessor-defines so weit wie möglich zu verzichten und wenn man sie doch mal braucht, 2. vor der Definition immer erst mal zu prüfen, ob es das define schon gibt und dann mit einem error auszusteigen und 3. einen möglichst kollisionsarmen define-Namen zu wählen. Zum Beispiel:

Code:
// Header inclusion guard
#ifndef MyHeaderFile_h
#define MyHeaderFile_h

#ifdef SOME_LONG_PREFIX_THE_ACTUAL_DEFINE_SYMBOL
    // Hätten die SDL / OpenCL-Fritzen das gemacht, wären Furtano's Bemühungen
    // zwar auch mit einem Kompilierfehler  entlohnt worden,
    // aber zumindest hätte er eine wesentlich hilfreichere Fehlermeldung bekommen.
    #error "Dammit! SOME_LONG_PREFIX_THE_ACTUAL_DEFINE_SYMBOL is already defined!"
#endif

#define SOME_LONG_PREFIX_THE_ACTUAL_DEFINE_SYMBOL ....

#endif // Ende vom Header inclusion guard

Hat man natürlich nicht immer selbst in der Hand.
 
Zurück
Oben