【问题标题】:How to change the following Makefile of LINUX ,so that it works on MACOS as well [closed]如何更改以下 LINUX 的 Makefile,使其也适用于 MACOS [关闭]
【发布时间】:2020-04-12 20:56:07
【问题描述】:

我的 Linux 电脑上有一个 Makefile。我也想在 MacOS 上构建和运行相同的程序。如何编辑以下 Makefile ?

我想编译一个具有图形库 EGGXProCALL JAXA "eggx.h" 的头文件的 C 程序。 我已经安装了 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 

【问题讨论】:

  • 这个问题与your previous question 有何不同?不要多次发布同一个问题。
  • 尝试构建时有什么问题?编译、链接、执行?
  • 这意味着你必须使用gcc -I/usr/local/eggx-0.93r5 ...
  • 这意味着您需要使用 gcc -I/usr/local/eggx-0.93r5 -L/usr/local/eggx-0.93r5 -l eggx main.c -o program 以及我在另一个问题中给您的 X11 的其他标志。

标签: c linux macos makefile


【解决方案1】:

您分两步构建程序:

  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 中。

【讨论】:

  • 我在 usr/library 中再次安装了 EGGX,并按照您的建议编辑了 Makefile。但是,我又遇到了完全相同的错误。
  • @RomanKshetri 您是否更新了包含目录选项 (-I/usr/local/include) 和链接目录选项 (L/usr/local/lib64)? eggx.h 头文件在哪里
  • 我发现 eggx.h 文件在这里。 /usr/local/eggx-0.93r5/eggx.h 是的,我按照你的建议编辑了makefile。但是没有用。
  • @RomanKshetri 那么包含目录选项应该是-I/usr/local/eggx-0.93r5
【解决方案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

实际执行的操作取决于您正在安装的软件包,但作为一般规则,它会将您刚刚创建的头文件和库复制到 “已知” 位置,例如 @987654330 @ 或 /opt/package。这个想法是通过“发布”或将它们安装到已知位置,使您自己的代码需要的所有文件可供计算机的所有用户使用。

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

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

如果你的程序像这样使用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 命令中,以告诉链接器它在哪里以及它的名称:

gcc ... -L/path/to/somewhere/lib -leggx

如果您的程序使用 X11,您必须在 Mac 上安装 XQuartz,并将 X11 的标志/开关添加到您的编译中:

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

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

可能看起来像这样:

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

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2012-11-21
    • 2012-09-13
    • 2019-01-28
    • 1970-01-01
    • 2014-03-13
    • 2020-11-07
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多