如何更改以下LINUX的Makefile,使其也可在MACOS上使用[关闭]

问题描述 投票:-1回答:2
我在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

c linux macos makefile
2个回答
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

实际执行的操作取决于您所安装的软件包,但是通常,它将把您刚刚制作的头文件和库复制到

“ known”

位置,例如/usr/local或[C0 ]。想法是通过“”发布“或将它们安装到已知位置,使计算机的所有用户都可以使用您自己的代码需要的所有文件。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

您分两步构建程序:

    将源文件构建为目标文件
  • 将目标文件与库链接以创建最终的可执行程序
  • 预处理器(处理EGGINC = -I /path/to/somewhere/include EGGLIB = -L /path/to/somewhere/lib -leggx X11INC = -I /opt/X11/include X11LIB = -L /opt/X11/lib -lx11 $(OBJS): $(OBJS).o gcc $(OBJS).c -o $(OBJS) $(EGGLIB) $(X11LIB) $(OBJS).o: $(OBJS).c gcc -I/usr/local/include $(EGGINC) $(X11INC) -c $(OBJS).c 指令)是目标文件构建的一部分。因此,创建目标文件所需的所有标志(例如#include选项)都应该在此存在,并且仅在此存在。
  • 因此,可以如下更改两个规则:

    -I

    当然,假设EGGX库已安装在$(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
    中。

    0
    投票
    您分两步构建程序:
    © www.soinside.com 2019 - 2024. All rights reserved.