如何更改以下LINUX的Makefile,以便它也可以在MACOS上运行

时间:2019-12-20 10:23:59

标签: c linux macos makefile

我在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 

2 个答案:

答案 0 :(得分:2)

您必须按照正确的顺序进行操作,直到正确完成上一步之后,再继续下一步。

1。下载并解压缩该库。

通常使用git clonescp完成下载,以从某处复制源文件。

解压缩(从存档中解压缩)通常使用:

tar -xvf eggx-0.93r5.tar

通常会创建一个新目录(名称与tar文件相同,但没有.tar扩展名),如:

eggx-0.93r5

2。构建库。

通常,您需要将目录更改为新创建的目录,然后运行make。我上次给了您Makefile,所以您需要这样做:

cd eggx-0.93r5
cp MAKEFILEFROMMARK Makefile
make

应该没有错误。如果有错误,则必须解决它们,然后运行:

make clean        # delete any rubbish from previous failed build
make

3。安装库。

通常,您可以通过以下方式进行操作:

make install

实际执行的操作取决于您所安装的软件包,但是通常,它将把头文件和您刚刚创建的库复制到“已知” 位置,例如{{ 1}}或/usr/local。想法是通过“发布” 或将它们安装到已知位置,使计算机的所有用户都可以使用您自己的代码需要的所有文件。

4。找出如何编译使用该库的简单C程序。

您应该在与下载库的位置完全不同的目录中执行以下步骤-请勿将代码与库的代码混在一起。

如果您的程序像这样使用/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

5。制作一个包含您在(4)中学到的知识的Makefile。

可能看起来像这样:

./program

答案 1 :(得分:0)

分两步构建程序:

  1. 将源文件构建为目标文件
  2. 将目标文件与库链接以创建最终的可执行程序

预处理器(处理#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中。