我在Linux PC上有一个Makefile,我也想在MacOS上构建并运行相同的程序。如何编辑以下Makefile?
我想编译一个C图形程序,该图形程序具有图形库EGGXProCALL JAXA“ eggx.h”的头文件。 我已经安装了Xcode,XQuartz。
我已经在以下目录中安装了EGGX文件。
[Home @ / opt / eggx] $
我在以下目录中有一个C文件。
[Home @〜/ Desktop / development] $
我已经检查了以下内容。
①gcc在这里工作正常 [Home @〜/ Desktop / development] $
②甚至示例程序中显示数字时钟的作品, 当前目录为 [Home @ / opt / eggx] $
③问题
当我尝试通过使用我在Linux中拥有的makefile从 [Home @〜/ Desktop / development] $ 生成[make]程序时。
我总是收到以下错误消息。
[Home~/Desktop/development]$ sudo make
gcc -c main.c
main.c:7:10: fatal error: 'eggx.h' file not found
#include <eggx.h>
^~~~~~~~
1 error generated.
make: *** [main.o] Error 1
[Home@~/Desktop/development]$
这是Makefile
# Makefile
OBJS = main
$(OBJS): $(OBJS).o
# gcc -O2 -Wall $(OBJS).c -o $(OBJS) -I/usr/local/include -L/usr/local/lib64 -leggx -lX11 -lm
gcc $(OBJS).c -o $(OBJS) -I/usr/local/include -L/usr/local/lib64 -leggx -lX11 -lm
$(OBJS).o: $(OBJS).c
gcc -c $(OBJS).c
.PHONY: clean
clean:
rm -f $(OBJS) $(OBJS).o
答案 0 :(得分:2)
您必须按照正确的顺序进行操作,直到正确完成上一步之后,再继续下一步。
通常使用git clone
或scp
完成下载,以从某处复制源文件。
解压缩(从存档中解压缩)通常使用:
tar -xvf eggx-0.93r5.tar
通常会创建一个新目录(名称与tar文件相同,但没有.tar
扩展名),如:
eggx-0.93r5
通常,您需要将目录更改为新创建的目录,然后运行make
。我上次给了您Makefile,所以您需要这样做:
cd eggx-0.93r5
cp MAKEFILEFROMMARK Makefile
make
应该没有错误。如果有错误,则必须解决它们,然后运行:
make clean # delete any rubbish from previous failed build
make
通常,您可以通过以下方式进行操作:
make install
实际执行的操作取决于您所安装的软件包,但是通常,它将把头文件和您刚刚创建的库复制到“已知” 位置,例如{{ 1}}或/usr/local
。想法是通过“发布” 或将它们安装到已知位置,使计算机的所有用户都可以使用您自己的代码需要的所有文件。
您应该在与下载库的位置完全不同的目录中执行以下步骤-请勿将代码与库的代码混在一起。
如果您的程序像这样使用/opt/package
:
eggx.h
然后您需要找到#include "eggx.h"
的位置:
eggx.h
如果导致以下结果:
find /usr /opt /Users -name eggx.h
这意味着您必须将其添加到/path/to/somewhere/include/eggx.h
命令中,以告诉编译器如何找到它:
gcc
如果您的图书馆称为gcc -I/path/to/somewhere/include ...
,则也需要找到它:
libeggx.a
如果导致以下结果:
find /usr /opt /Users -name "libegg*a"
这意味着您需要将其添加到/path/to/somewhere/lib/libeggx.a
命令中,以告知链接器它在哪里以及被称为什么:
gcc
如果程序使用X11,则必须在Mac上安装XQuartz,并将X11的标志/开关添加到编译中:
gcc ... -L/path/to/somewhere/lib -leggx
因此,将所有内容放在一起,如果您的程序称为gcc ... -I /opt/X11/include -L /opt/X11/lib -lx11 ...
,则将编译并链接:
program.c
然后运行:
gcc program.c -o program -I/path/to/somewhere/include -I /opt/X11/include -L /opt/X11/lib -lx11 -L/path/to/somewhere/lib -leggx
可能看起来像这样:
./program
答案 1 :(得分:0)
分两步构建程序:
预处理器(处理#include
指令)是目标文件构建的一部分。因此,创建目标文件所需的所有标志(例如-I
选项)都应该存在于此并且仅存在于那里。
因此,可以如下更改两个规则:
$(OBJS): $(OBJS).o
gcc $(OBJS).c -o $(OBJS) -L/usr/local/lib64 -leggx -lX11 -lm
$(OBJS).o: $(OBJS).c
gcc -I/usr/local/include -c $(OBJS).c
当然,假设EGGX库已安装在/usr/local
中。