使用 clang++ 和 SDL 包含路径
Include path using clang++ and SDL
我有一个 SDL 程序,我需要在我的 Mac 上使用以下行进行编译:
#include <SDL.h>
我使用 MacPorts 安装了 libsdl,sdl-config --cflags
的输出是:
-I/opt/local/include/SDL -D_GNU_SOURCE=1 -D_THREAD_SAFE
这确实是 SDL headers 所在的位置:
$ ls /opt/local/include/SDL
SDL.h SDL_cpuinfo.h SDL_keyboard.h SDL_rwops.h
...
然后我的 Makefile 使用以下命令调用编译器 (clang++):
CXXFLAGS=`sdl-config --cflags`
使用 -v
调用编译器显示它被包含在搜索路径中:
#include "..." search starts here:
#include <...> search starts here:
/opt/local/include/SDL
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
但编译器错误:
./drawable.h:4:10: fatal error: 'SDL.h' file not found
#include <SDL.h>
^
如果我将其更改为 #include <SDL/SDL.h>
,它可以正常编译,但是程序需要编译的其他 (Linux) 机器不会那样指定。我对如何设置包含路径有什么不了解?
编辑:
这是一个最小的例子:
$ cat main.cpp
#include <SDL.h>
int main(int argc, char *argv[]) { }
$ sdl-config --cflags
-I/opt/local/include/SDL -D_GNU_SOURCE=1 -D_THREAD_SAFE
$ ls /opt/local/include/SDL/SDL.h
/opt/local/include/SDL/SDL.h
$ clang++ -v `sdl-config --cflags` main.cpp
...
#include "..." search starts here:
#include <...> search starts here:
/opt/local/include/SDL
....
main.cpp:1:10: fatal error: 'SDL.h' file not found
#include <SDL.h>
^
1 error generated.
答案:
SDL.h
原来是一个坏符号link,我自己的错。
我认为在你的Makefile中,CXXFLAGS没有包含在编译命令中。
你的 Makefile 应该是这样的:
$(CXX) $(CXXFLAGS) $(SRC) -o $(EXE)
好吧,这只是我自己的愚蠢,但也许其他人会从中受益。我创建了/opt/local/include/SDL
目录并用软links填充到/Library/Frameworks/SDL.framework/Headers
中的实际头文件,因为我的项目依赖前者。然后,我在研究另一种安装 SDL 的方法时删除了框架,留下一堆死的 links。没有参数的 ls
有助于向我显示文件名,但不是 links,我此时已经忘记了。所以,SDL.h
并不真正存在。一个更聪明的方法可能是软 link 目录,这可能会给出更有用的错误消息,但我也试图将其他一些 SDL 包 link 放在那里。
我有一个 SDL 程序,我需要在我的 Mac 上使用以下行进行编译:
#include <SDL.h>
我使用 MacPorts 安装了 libsdl,sdl-config --cflags
的输出是:
-I/opt/local/include/SDL -D_GNU_SOURCE=1 -D_THREAD_SAFE
这确实是 SDL headers 所在的位置:
$ ls /opt/local/include/SDL
SDL.h SDL_cpuinfo.h SDL_keyboard.h SDL_rwops.h
...
然后我的 Makefile 使用以下命令调用编译器 (clang++):
CXXFLAGS=`sdl-config --cflags`
使用 -v
调用编译器显示它被包含在搜索路径中:
#include "..." search starts here:
#include <...> search starts here:
/opt/local/include/SDL
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.1.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
但编译器错误:
./drawable.h:4:10: fatal error: 'SDL.h' file not found
#include <SDL.h>
^
如果我将其更改为 #include <SDL/SDL.h>
,它可以正常编译,但是程序需要编译的其他 (Linux) 机器不会那样指定。我对如何设置包含路径有什么不了解?
编辑:
这是一个最小的例子:
$ cat main.cpp
#include <SDL.h>
int main(int argc, char *argv[]) { }
$ sdl-config --cflags
-I/opt/local/include/SDL -D_GNU_SOURCE=1 -D_THREAD_SAFE
$ ls /opt/local/include/SDL/SDL.h
/opt/local/include/SDL/SDL.h
$ clang++ -v `sdl-config --cflags` main.cpp
...
#include "..." search starts here:
#include <...> search starts here:
/opt/local/include/SDL
....
main.cpp:1:10: fatal error: 'SDL.h' file not found
#include <SDL.h>
^
1 error generated.
答案:
SDL.h
原来是一个坏符号link,我自己的错。
我认为在你的Makefile中,CXXFLAGS没有包含在编译命令中。
你的 Makefile 应该是这样的:
$(CXX) $(CXXFLAGS) $(SRC) -o $(EXE)
好吧,这只是我自己的愚蠢,但也许其他人会从中受益。我创建了/opt/local/include/SDL
目录并用软links填充到/Library/Frameworks/SDL.framework/Headers
中的实际头文件,因为我的项目依赖前者。然后,我在研究另一种安装 SDL 的方法时删除了框架,留下一堆死的 links。没有参数的 ls
有助于向我显示文件名,但不是 links,我此时已经忘记了。所以,SDL.h
并不真正存在。一个更聪明的方法可能是软 link 目录,这可能会给出更有用的错误消息,但我也试图将其他一些 SDL 包 link 放在那里。