提问人:ajsdiubfaoishd 提问时间:7/29/2023 最后编辑:ajsdiubfaoishd 更新时间:7/29/2023 访问量:30
使用 xQuartz 的 macOS 上 X11 项目的 Makefile 找不到 <X11/Xlib.h>
Makefiles for X11 project on macOS with xQuartz cannot find <X11/Xlib.h>
问:
我正在尝试为我的图形项目设置一个 makefile。我在 macOS 上使用 X11,所以我安装了 xQuartz。我检查了我的安装文件夹,它的所有内容都正确无误。我能够运行测试程序。我的项目由一个文件夹中的一堆文件组成,我只想创建一个编译所有内容的 makefile。/opt/X11/
xeyes
.cc
这是我的文件夹设置
这是我创建makefile的尝试
CXX=g++
CXXFLAGS=-std=c++14 -Wall -g -MMD
EXEC=main
CCFILES=$(wildcard *.cc)
OBJECTS=${CCFILES:.cc=.o}
DEPENDS=${CCFILES:.cc=.d}
X11FLAGS=-I/opt/X11/include
X11LIBS=-L/opt/X11/lib -lX11
${EXEC}: ${OBJECTS}
${CXX} -std=c++14 -o ${EXEC} ${X11FLAGS} ${OBJECTS} ${X11LIBS} -include ${DEPENDS}
当我运行时,我得到这个输出make -n
g++ -std=c++14 -Wall -g -MMD -c -o gfx_demo_main.o gfx_demo_main.cc
g++ -std=c++14 -Wall -g -MMD -c -o gfx_demo_window.o gfx_demo_window.cc
g++ -std=c++14 -o main -I/opt/X11/include gfx_demo_main.o gfx_demo_window.o -L/opt/X11/lib -lX11 -include gfx_demo_main.d gfx_demo_window.d
然后,当我运行makefile时,出现此错误。
g++ -std=c++14 -Wall -g -MMD -c -o gfx_demo_main.o gfx_demo_main.cc
In file included from gfx_demo_main.cc:5:
./gfx_demo_window.h:7:10: fatal error: 'X11/Xlib.h' file not found
#include <X11/Xlib.h>
^~~~~~~~~~~~
1 error generated.
我怀疑这是因为我在 make 中使用隐式 C++ 文件编译设置进行文件的初始编译,并且该设置没有正确包含/链接 X11 库。.cc
我有一个用于编译的工作命令,我执行以下命令,它编译良好。但我宁愿想要一个 makefile 来完成繁重的工作,因为我的项目需要更多的文件。
g++ -std=c++14 -I/opt/X11/include gfx_demo_main.cc gfx_demo_window.cc -L/opt/X11/lib -lX11
如何让我的 makefile 正常工作?我确定问题不在于我的文件本身,因为它们是从官方演示中下载的,我编译并在他们的演示环境中运行正常。这是文件本身的标题,但我 99% 确定问题不在于它们。.cc
#include
gfx_demo_main.cc
#include <iostream>
#include "gfx_demo_window.h"
using namespace std;
int main() {
Xwindow w;
for (int i = Xwindow::White ; i <= Xwindow::Blue; i++) {
w.fillRectangle(50 * i, 200, 50, 250, i);
}
w.drawString(50, 50, "Hello!");
w.drawString(50, 100, "ABCD");
w.drawString(50, 150, "Hello!");
Xwindow w2(199, 199);
w2.drawString(50, 100, "ABCD");
char c;
cin >> c;
}
gfx_demo_window.cc
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <iostream>
#include <cstdlib>
#include <string>
#include <unistd.h>
#include "gfx_demo_window.h"
using namespace std;
Xwindow::Xwindow(int width, int height) {
d = XOpenDisplay(NULL);
if (d == NULL) {
cerr << "Cannot open display" << endl;
exit(1);
}
s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, width, height, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapRaised(d, w);
Pixmap pix = XCreatePixmap(d,w,width,
height,DefaultDepth(d,DefaultScreen(d)));
gc = XCreateGC(d, pix, 0,(XGCValues *)0);
XFlush(d);
XFlush(d);
// Set up colours.
XColor xcolour;
Colormap cmap;
char color_vals[7][10]={"white", "black", "red", "green", "blue"};
cmap=DefaultColormap(d,DefaultScreen(d));
for(int i=0; i < 5; ++i) {
XParseColor(d,cmap,color_vals[i],&xcolour);
XAllocColor(d,cmap,&xcolour);
colours[i]=xcolour.pixel;
}
XSetForeground(d,gc,colours[Black]);
// Make window non-resizeable.
XSizeHints hints;
hints.flags = (USPosition | PSize | PMinSize | PMaxSize );
hints.height = hints.base_height = hints.min_height = hints.max_height = height;
hints.width = hints.base_width = hints.min_width = hints.max_width = width;
XSetNormalHints(d, w, &hints);
XSynchronize(d,True);
usleep(1000);
}
Xwindow::~Xwindow() {
XFreeGC(d, gc);
XCloseDisplay(d);
}
void Xwindow::fillRectangle(int x, int y, int width, int height, int colour) {
XSetForeground(d, gc, colours[colour]);
XFillRectangle(d, w, gc, x, y, width, height);
XSetForeground(d, gc, colours[Black]);
}
void Xwindow::drawString(int x, int y, string msg) {
XDrawString(d, w, DefaultGC(d, s), x, y, msg.c_str(), msg.length());
}
gfx_demo_window.h
#ifndef __WINDOW_H__
#define __WINDOW_H__
#include <X11/Xlib.h>
#include <iostream>
#include <string>
class Xwindow {
Display *d;
Window w;
int s;
GC gc;
unsigned long colours[10];
public:
Xwindow(int width=500, int height=500); // Constructor; displays the window.
~Xwindow(); // Destructor; destroys the window.
Xwindow(const Xwindow&) = delete;
Xwindow &operator=(const Xwindow&) = delete;
enum {White=0, Black, Red, Green, Blue}; // Available colours.
// Draws a rectangle
void fillRectangle(int x, int y, int width, int height, int colour=Black);
// Draws a string
void drawString(int x, int y, std::string msg);
};
#endif
任何帮助,非常感谢。对于这个项目,我必须使用基本的 X11。
答: 暂无答案
评论