【问题标题】:Write a one make file to compile a project wihich has both source codes and header files in different directories编写一个 make 文件来编译一个项目,该项目在不同的目录中有源代码和头文件
【发布时间】:2013-05-21 20:50:27
【问题描述】:

我正在尝试为我的客户提供的目录结构和文件列表编写 Makefile 脚本。下图大致展示了源文件和头文件在项目主目录中的位置。

rootDir/
-lib/
  -socketserver/
-dist/
  -bin/

-include/
  -abms_engine_socket_server/
    -abms_engine_socket_server.h
    -common/
      -----
    -hashtable/
      -----
-src/
  -abms_engine_socket_server/
    -Makefile
    -abms_engine_socket_server.c
    -common/
      -----
    -hashtable/
      -----

在这种情况下,下面是构建目标目录

库文件目录:(rootDir)/lib/socketserver bin 文件目录:(rootDir)/dist/bin/abms_engine_socket_server 制作文件目录:(rootDir)/src/abms_engine_socket_server 包含文件和源文件也位于“include”和“src”目录中。

我已经尝试使用下面的脚本来编译整个源文​​件。

HEADER_DIR = ../../include/abms_engine_socket_server
HEADER_COMMON_DIR = $(HEADER_DIR)/common
HEADER_HASHTABLE_DIR = $(HEADER_DIR)/hashtable

SRC_DIR = ..
SRC_COMMON_DIR = $(SRC_DIR)/common
SRC_HASHTABLE_DIR = $(SRC_DIR)/hashtable
OBJ_DIR = ../../lib/socketserver
DEST_DIR = ../../dist/bin
SRC = abms_engine_socket_server.c

CC = gcc -g -std=gnu99 -DUNIX -DINTERNAL_LOGGER
CFLAGS = -lm

PROG_ENG_SOCKET_SVR = $(DEST_DIR)/abms_engine_socket_server

HASHTABLE_OBJS = $(OBJ_DIR)/hashtable.o $(OBJ_DIR)/hashtable_itr.o $(OBJ_DIR)/hashtable_utility.o
COMMON_OBJS = $(OBJ_DIR)/CUtil.o $(OBJ_DIR)/CConfig.o $(OBJ_DIR)/CSocket.o

#Compiler to compile the hashtable objects
$(OBJ_DIR)/%.o : $(SRC_HASHTABLE_DIR)/%.c
    $(CC) -c $< -o $@

#Compiler to compile the common objects which have header files too
$(OBJ_DIR)/%.o : $(SRC_COMMON_DIR)/%.c
    $(CC) -c $< -o $@

#Compiler to compile the process objects which do not have header files
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
    $(CC) -c $< -o $@

#Compiler to compile the other binaries
$(DEST_DIR)/% : $(OBJ_DIR)/%.o $(HASHTABLE_OBJS) $(COMMON_OBJS)
    $(CC) $(CFLAGS) $(HASHTABLE_OBJS) $(COMMON_OBJS) $< -o $@

#all: $(PROG_ENG_SOCKET_SVR)
all: $(SRC) $(PROG_ENG_SOCKET_SVR)

clean:
    rm -f *~ $(OBJ_DIR)/*.o $(PROG_ENG_SOCKET_SVR)

但最后我得到以下错误 make: 'all' 无事可做。

请指导我创建此 make 文件以使用单个 make 文件编译这些源代码。欢迎所有回复。 谢谢。

【问题讨论】:

  • 当你make clean,然后make ../../lib/socketserver/abms_engine_socket_server.o时会发生什么?
  • @Beta,我刚刚尝试过并给出了以下输出。 ---------------------------------------------- >>$ 制作make: Nothing to be done for all'. &gt;&gt;$ make clean rm -f *~ ../../lib/socketserver/*.o ../../dist/bin/abms_engine_socket_server rm: cannot remove ../../dist/bin/abms_engine_socket_server': 是目录 make: *** [clean] Error 1 -------------- ------------------------------------------------ 据此,我认为构建目标也应该在制作文件。
  • 你对目录结构的描述在斜杠的使用上不一致。 include/abms_engine_socket_serversrc/abms_engine_socket_server 似乎都是目录,尽管它们没有斜杠。但是dist/bin/abms_engine_socket_server/ 有一个斜线,即使 Makefile 将其视为目标文件。如果是目录,建议你删除后重试。
  • @Beta,我刚刚从目录结构中的目标目录中删除了“abms_engine_socket_server”,然后重试而不对 Makefile 进行任何更改。然后它遇到了这个错误(for make all)“make: *** No rule to make target ../../dist/bin/abms_engine_socket_server', needed by all'。停止。”
  • 当你先 make clean,然后再 make ../../lib/socketserver/abms_engine_socket_server.o 会发生什么?

标签: c shell unix gcc makefile


【解决方案1】:

我有一个相当相似的结构,所以如果对你有帮助,你可以看看我在此处记录的 makefile。

Makefile: no rule to make target

您必须查看已接受的答案,即包含我的工作版本的答案。

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多