Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL2 No such file or directory

14 août 2019 à 15:47:38

Bonjour à tous,

Je précise avant tout que je code sous linux

Je souhaite m'initier à OpenGl mais mon soucis est que lorsque je veux inclure dans mon code (en C++) l'entête <SDL2/SDL.h> cela me retourne l'erreur suivante : SDL2/SDL.h no such file or directory

J'ai vérifier, le header est bien dans /usr/include/SDL2

Et je compile avec cette ligne :  g++ program.cpp -o prog -I/usr/include/SDL2 `pkg-config --cflags --libs sdl2`

Mais rien ne fonctionne, même après avoir chercher plusieurs heures, ce pourquoi je m'en remet à vous.

Merci à tout ceux qui m'aiderons !

-
Edité par ArthurMariet 14 août 2019 à 15:48:11

  • Partager sur Facebook
  • Partager sur Twitter
14 août 2019 à 17:51:46

Si tu ajoutes le dossier /usr/include/SDL2, le fichier est accessible avec SDL.h, pas SDL2/SDL.h. Mais il n'y a pas de raison de faire un ajout explicite des includes systèmes, car l'option implicitement ajoutée est : -isystem /usr/include.

Que donne g++ -xc++ -v -E program.cpp ? La commande va afficher les dossiers de recherche pour les includes.

  • Partager sur Facebook
  • Partager sur Twitter
14 août 2019 à 18:46:54

Bonjour,

Normalement l'include standard pour la SDL2 , c'est:

#include "SDL.h"

Les chevrons étants réservés pour les includes présents dans le(s) dossier(s) du compilateur.

-
Edité par Warren79 14 août 2019 à 18:47:16

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

14 août 2019 à 23:57:17

Le standard C99 dit (en 6.10.2) que les règles de recherche pour #include sont définies par l'implémentation. Les chevrons ne sont donc pas réservés.

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

Donc ça dépend.  Chez moi ça marche (tm)  avec les deux ("", <>) pour SDL2/SDL.h, le fichier étant dans /usr/include/SDL2/SDL.h

Une des différences notables habituelles, est que si on met des guillemets, la recherche d'un fichier d'entete est tentée d'abord dans le répertoire courant, puis dans ceux qui sont indiqués par les options genre -I.

Alors que les chevrons, c'est dans les répertoires "système", quoi que ce mot puisse vouloir dire, ce qui inclue _en particulier_ les entêtes standard de la bibliothèque C (7.1.2).

<assert.h> <complex.h> <ctype.h> ...

mais pas seulement.

 --- les règles de gcc : https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

3.15 Options for Directory Search

These options specify directories to search for header files, for libraries and for parts of the compiler:

-I dir
-iquote dir
-isystem dir
-idirafter dir

    Add the directory dir to the list of directories to be searched for header files during preprocessing. If dir begins with ‘=’ or $SYSROOT, then the ‘=’ or $SYSROOT is replaced by the sysroot prefix; see --sysroot and -isysroot.

    Directories specified with -iquote apply only to the quote form of the directive, #include "file". Directories specified with -I, -isystem, or -idirafter apply to lookup for both the #include "file" and #include <file> directives.

    You can specify any number or combination of these options on the command line to search for header files in several directories. The lookup order is as follows:

        For the quote form of the include directive, the directory of the current file is searched first.
        For the quote form of the include directive, the directories specified by -iquote options are searched in left-to-right order, as they appear on the command line.
        Directories specified with -I options are scanned in left-to-right order.
        Directories specified with -isystem options are scanned in left-to-right order.
        Standard system directories are scanned.
        Directories specified with -idirafter options are scanned in left-to-right order. 

    You can use -I to override a system header file, substituting your own version, since these directories are searched before the standard system header file directories. However, you should not use this option to add directories that contain vendor-supplied system header files; use -isystem for that.

    The -isystem and -idirafter options also mark the directory as a system directory, so that it gets the same special treatment that is applied to the standard system directories.

    If a standard system include directory, or a directory specified with -isystem, is also specified with -I, the -I option is ignored. The directory is still searched but as a system directory at its normal position in the system include chain. This is to ensure that GCC’s procedure to fix buggy system headers and the ordering for the #include_next directive are not inadvertently changed. If you really need to change the search order for system directories, use the -nostdinc and/or -isystem options.
(bon courage pour lire la suite)

-
Edité par michelbillaud 15 août 2019 à 0:07:50

  • Partager sur Facebook
  • Partager sur Twitter
15 août 2019 à 3:28:03

Pour C++17 c'est du même genre: <> -> dépend de l'implémentation ; "" -> dépend de l'implémentation, mais si rien n'est trouvé, il faut le refaire comme ci c'était un <>.

Il y a quand même une petite note indiquant que le programmeur devrait utiliser <> pour les en-têtes fournis avec l’implémentation et "" pour les autres. Je suppose qu'il faut comprendre avec l'implémentation du compilateur.

-
Edité par jo_link_noir 15 août 2019 à 3:28:55

  • Partager sur Facebook
  • Partager sur Twitter
15 août 2019 à 10:20:38

Pendant un temps (à mes débuts avec le c++ et la SDL2) , j' utilisais les chevrons pour les includes de la SDL2. J'ai changé mon fusil d'épaule en lisant un post de Markand.
  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

15 août 2019 à 14:37:22

Merci à tous pour vos réponses !

Donc à la compilatio

n avec cette ligne cela affiche, g++ -xc++ -v -E program.cpp, cela m'affiche le message suivant.

-----------------------------------------------

Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18+deb9u1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
COLLECT_GCC_OPTIONS='-v' '-E' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/6/cc1plus -E -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE program.cpp -mtune=generic -march=x86-64
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/6"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/home/marty/.libs/CSFML-2.2/include"
ignoring nonexistent directory "/home/marty/.libs/SFML-2.2/include"
#include "..." search starts here:
#include <...> search starts here:
 .
 /home/marty/.libs/glew-1.10.0/include
 /usr/include/c++/6
 /usr/include/x86_64-linux-gnu/c++/6
 /usr/include/c++/6/backward
 /usr/lib/gcc/x86_64-linux-gnu/6/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/6/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
# 1 "program.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "program.cpp"
program.cpp:1:17: fatal error: SDL.h: No such file or directory
 #include "SDL.h"
                 ^
compilation terminated.

  • Partager sur Facebook
  • Partager sur Twitter
15 août 2019 à 19:39:05

La convention définie par SDL c'est SDL.h sans préfixe de répertoire. Et c'est ce que sdl2-config et le pkgconfig te fourniras en chemin d'include pour pouvoir include SDL.h directement.
  • Partager sur Facebook
  • Partager sur Twitter

git is great because Linus did it, mercurial is better because he didn't.