【问题标题】:Make object file for each source file and merge them as binary为每个源文件制作目标文件并将它们合并为二进制文件
【发布时间】:2014-05-15 07:49:21
【问题描述】:

这是我第一次编写 Makefile。我尝试使用以下 Makefile 为 src 文件夹中的每个源文件创建目标文件,合并它们并在 bin 文件夹中创建二进制文件 out.exe。

SRC=src
INC=inc
OBJ=obj
BIN=bin

CC=/usr/sfw/bin/gcc
FLAGS=-g -m64 -Wall

ALL_INC=-I$(INC)

CC_LIBS=-lsocket -lnsl -lpthread -lm -lstdc++ -lclntsh

$(BIN)/out.exe : $(OBJ)/%.o
   $(CC) $(ALL_INC) $(FLAGS) -o out.exe

$(OBJ)/%.o : $(SRC)/%.cpp $(INC)/%.h
   $(CC) $(ALL_INC) $(FLAGS) -c $<

clean:
   rm -f obj/*.o bin/ussd

在调用 make 时出现以下错误。

make: Fatal error: Don't know how to make target `obj/%.o'

下面我列出了我的系统中可用的 make 工具及其版本

/bin - dmake - Sun Distributed Make 7.7
/usr/bin - dmake - Sun Distributed Make 7.7
/usr/ccs/bin - make - Unknow version
/usr/sfw/bin - gmake - GNU Make 3.80
/usr/xpg4/bin - Unknow version
/usr/local/bin - make - GNU Make version 3.79.1

【问题讨论】:

  • 你在使用 GNU make 吗?还是某种 Solaris 制造的?因为该错误不是任何版本的 GNU make 都会打印的消息。 POSIX 标准没有为 make 指定模式规则,因此不同的版本以不同的方式实现它们(或根本不实现它们):您应该指定您正在使用的 make 实现。
  • 如何找到make实现细节
  • 使用man make查看手册页并查看哪些选项可用于显示这些详细信息,或运行make -vmake --versionmake -versionmake -hmake --help ,其中一项或多项可能会为您提供该信息。
  • 我在 Solaris 环境中。您给出的命令均未显示版本。使用 man 命令我找到了这个 SunOS 5.10
  • 如果这些都不起作用,那么你肯定没有使用 GNU make。

标签: makefile solaris


【解决方案1】:

问题出在这一行:

$(BIN)/out.exe : $(OBJ)/%.o
   $(CC) $(ALL_INC) $(FLAGS) -o out.exe

$(BIN)/out.exe 必须知道它所依赖的所有文件

添加这个:

SRCS=$(wildcard $(SRC)/*.cpp) // List all source files
OBJS=$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) // List all object files (one for each source file)

然后更改out.exe规则:

$(BIN)/out.exe : $(OBJS)

【讨论】:

  • 运行没有错误,但没有创建任何对象或二进制文件
  • 您必须保留规则的配方部分。 Carl 的示例只是向您展示了如何更改先决条件列表。其余的都应该是一样的。
  • 请注意,$(wildcard ...) 需要使用 GNU make(又名 gmake),并且不能与 Solaris make 或 dmake 程序一起使用。
猜你喜欢
  • 2020-09-14
  • 2022-01-02
  • 2022-01-14
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多