【问题标题】:Makefile dependency issueMakefile依赖问题
【发布时间】:2012-03-23 21:16:21
【问题描述】:

我正在尝试编译一个示例代码,其中我在新目录下添加了一个新文件,但我一直遇到依赖问题。 我在“/interface”下添加了一个文件“ipc.c”。 我已将源文件添加到“srcs”,并添加了带有“-I/interface”的目录。 Makefile 如下所示:

#
# ======== Makefile ========
#


include ../products.mak


srcs = main_host.c interface/ipc.c


objs = $(addprefix bin/$(PROFILE)/obj/,$(patsubst %.c,%.o$(SUFFIX),$(srcs)))
libs = $(SYSLINK_INSTALL_DIR)/packages/ti/syslink/lib/syslink.a_$(PROFILE)



MAKEVARS = \
SYSLINK_INSTALL_DIR=$(SYSLINK_INSTALL_DIR) \
PKGPATH=$(PKGPATH)

all:
@$(ECHO) "!"
@$(ECHO) "! Making $@ ..."
$(MAKE) $(MAKEVARS) PROFILE=debug SUFFIX=v5T togs2_host
$(MAKE) $(MAKEVARS) PROFILE=release SUFFIX=v5T togs2_host

install:
@$(ECHO) "#"
@$(ECHO) "# Making $@ ..."
@$(MKDIR) $(INSTALL_DIR)/debug
$(CP) bin/debug/togs2_host $(INSTALL_DIR)/debug
@$(MKDIR) $(INSTALL_DIR)/release
$(CP) bin/release/togs2_host $(INSTALL_DIR)/release

clean::
$(RMDIR) bin


# 
# 
# ======== rules ========
#
togs2_host: bin/$(PROFILE)/togs2_host
bin/$(PROFILE)/togs2_host: $(objs) $(libs)
@$(ECHO) "##"
@$(ECHO) "## Making $@ ..."
$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)



bin/$(PROFILE)/obj/%.o$(SUFFIX): %.h
bin/$(PROFILE)/obj/%.o$(SUFFIX): %.c
@$(ECHO) "###"
@$(ECHO) "### Making $@ ..."
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<


# ======== create output directories ========
ifneq (clean,$(MAKECMDGOALS))
ifneq (,$(PROFILE))
ifeq (,$(wildcard bin/$(PROFILE)))
$(shell $(MKDIR) -p bin/$(PROFILE))
endif
ifeq (,$(wildcard bin/$(PROFILE)/obj))
$(shell $(MKDIR) -p bin/$(PROFILE)/obj)
endif
endif
endif

# ======== install validation ========
ifeq (install,$(MAKECMDGOALS))
ifeq (,$(INSTALL_DIR))
$(error must specify INSTALL_DIR)
endif
endif

# ======== toolchain macros ========
ifeq (v5T,$(SUFFIX))
CC = $(CS_ARM_INSTALL_DIR)gcc -c -MD -MF $@.dep -march=armv5t
AR = $(CS_ARM_INSTALL_DIR)ar cr
LD = $(CS_ARM_INSTALL_DIR)gcc

CPPFLAGS = -D_REENTRANT -Dxdc_target_name__=GCArmv5T \
-Dxdc_target_types__=gnu/targets/arm/std.h

CFLAGS = -Wall -ffloat-store -fPIC -Wunused -Dfar= $(CCPROFILE_$(PROFILE)) \
-I. -I/interface $(addprefix -I,$(subst +, ,$(PKGPATH))) 

LDFLAGS = $(LDPROFILE_$(PROFILE)) -Wall -Wl,-Map=$@.map
LDLIBS = -lpthread -lc

CCPROFILE_debug = -ggdb -D DEBUG
CCPROFILE_release = -O3 -D NDEBUG

LDPROFILE_debug = -ggdb
LDPROFILE_release = -O3
endif

我不断收到此错误: 致命错误:打开依赖文件 bin/debug/obj/interface/ipc.ov5T.dep: No such file or directory

这是 products.mak 的样子:

#
#  ======== products.mak ========
#

DEPOT = /opt

BIOS_INSTALL_DIR        = $(DEPOT)/bios_6_33_01_25
IPC_INSTALL_DIR         = $(DEPOT)/ti/ipc_1_23_05_40
SYSLINK_INSTALL_DIR     = $(DEPOT)/syslink_2_10_02_17
TI_C6X_INSTALL_DIR      = $(DEPOT)/ti/ccsv5/tools/compiler/c6000
CS_ARM_INSTALL_DIR      = $(DEPOT)/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-
XDC_INSTALL_DIR         = $(DEPOT)/xdctools_3_23_00_32


PKGPATH := $(SYSLINK_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$(BIOS_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$(IPC_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$(XDC_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$


# Use this goal to print your product variables.
.show-products:
    @echo "BIOS_INSTALL_DIR         = $(BIOS_INSTALL_DIR)"
    @echo "IPC_INSTALL_DIR          = $(IPC_INSTALL_DIR)"
    @echo "SYSLINK_INSTALL_DIR      = $(SYSLINK_INSTALL_DIR)"
    @echo "TI_ARM_INSTALL_DIR       = $(TI_ARM_INSTALL_DIR)"
    @echo "TI_C6X_INSTALL_DIR       = $(TI_C6X_INSTALL_DIR)"
    @echo "CS_ARM_INSTALL_DIR       = $(CS_ARM_INSTALL_DIR)"
    @echo "XDC_INSTALL_DIR          = $(XDC_INSTALL_DIR)"


#  ======== standard macros ========
ifneq (,$(wildcard $(XDC_INSTALL_DIR)/bin/echo.exe))
    # use these on Windows
    CP      = $(XDC_INSTALL_DIR)/bin/cp
    ECHO    = $(XDC_INSTALL_DIR)/bin/echo
    MKDIR   = $(XDC_INSTALL_DIR)/bin/mkdir -p
    RM      = $(XDC_INSTALL_DIR)/bin/rm -f
    RMDIR   = $(XDC_INSTALL_DIR)/bin/rm -rf
else
    # use these on Linux
    CP      = cp
    ECHO    = echo
    MKDIR   = mkdir -p
    RM      = rm -f
    RMDIR   = rm -rf
endif

我没有完全理解 Makefile,因为它是我只是在扩展的代码示例。

【问题讨论】:

  • 你没有向我们展示整个问题。在顶部,此 makefile 包含文件 ../products.mak。该文件中可能有一行包含每个对象文件的.dep 文件,但它没有在正确的目录中查找您添加的文件(或者您可以说您将文件添加到错误的目录中;))。
  • StackO Aberdeen Meetup 2012:请参阅 SO Meetup Link 了解更多信息。看到您在阿伯丁,请尝试参加。明天我会删除这条评论。抱歉,但没有其他方式可以联系到 SO。

标签: makefile dependencies


【解决方案1】:

这个makefile相当复杂,所以需要一定的猜测,但我认为问题在于它不知道如何找到interface/ipc.c。尝试在底部添加这一行,看看是否有帮助:

vpath %.c interface

如果没有,我们可以尝试其他一些方法。 (如果是这样,我可以提出一些简化 makefile 的方法。)

【讨论】:

  • 仍然不适用于 Makefile 底部添加的那一行。
  • @Onklen,这很奇怪。您向我们展示的内容中没有任何内容涉及.dep 文件。我想尝试简化问题,发布一些简化的 makefile 供您尝试;您使用的是哪个操作系统?
  • 我使用的是 Ubuntu 11.10。我正在为 OMAPL138 芯片进行交叉编译。
【解决方案2】:

搞定了。

需要添加规则来创建输出目录。 所以我加了

ifeq (,$(wildcard bin/$(PROFILE)/obj/interface))
$(shell $(MKDIR) -p bin/$(PROFILE)/obj/interface)
endif

【讨论】:

    【解决方案3】:

    记录一下:错误“致命错误:打开依赖文件[...]:没有这样的文件或目录”也可能是由于路径太长造成的。在 Cygwin/Windows 上发生在我身上,路径超过 200 个字符(没有准确检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2023-03-13
      相关资源
      最近更新 更多