我这里以SDL2为例。
通常在C ++中,当我使用SDL2标头时,我的包含路径中是否应包含目录“ SDL2”:
#include "SDL2/SDL.h"
或者我应该将其删除,即:
#include "SDL.h"
我对好的约定感到困惑。如果我安装sdl2库并执行以下命令行:
$ pkg-config --cflags --libs sdl2
我得到:
-D_THREAD_SAFE -I/usr/local/include/SDL2 -L/usr/local/lib -lSDL2
这意味着我应该省略目录:
#include "SDL.h"
但是,查看名为SDL_image的SDL的同级库,我可以看到在SDL_image.h
内部,它们包含以下目录:
#include <SDL2/SDL.h>
#include <SDL2/SDL_version.h>
#include <SDL2/begin_code.h>
谁在这里做错了,是pkg-config还是SDL_image?
答案 0 :(得分:1)
每个库必须指定它希望您将其添加到路径的目录。否则,您将不得不反复试验才能发现所使用的任何 other 库所假定的答案,其中包括所涉及库的标题。此外,如果您最终需要为同一库提供多个条目,则会增加发生冲突的可能性(并降低构建速度)。
关于库是否是否应指定包含以库命名的子目录(或多个)的目录,这显然是一种意见,但我我愿意是。这样做可以使实际文件免于使用丑陋的名称,以免发生冲突。这样可以改善编辑体验,并允许库中的 文件通过不限定名称(当它们恰好是唯一的)相互引用。
对于SDL本身,不幸的是,情况令人困惑:有些教程在struct thread_data {
int x;
int y;
};
void *handler(void *parameter){
struct thread_data *data = parameter;
...
return NULL;
}
int main()
{
pthread_t tid;
struct thread_data data = { 1, 2 };
pthread_create(&tid, NULL, handler, &data);
...
}
中使用了斜杠,而有些则没有(即使在同一站点上!)。官方常见问题解答leaves it out,但似乎是在谈论#include
vs。 <>
。安装说明对use sdl2-config
说,我猜这将是最明智的约定。