gpt4 book ai didi

c - 使: create a test binary for each file in test directory

转载 作者:行者123 更新时间:2023-11-30 16:58:43 24 4
gpt4 key购买 nike

我正在构建的小型图书馆有一个简单的结构,如下所示。

  • 我希望 make build./source 下的源代码构建库 (libproj.a)
  • 我希望 make build_test./test 下以 test_ 为前缀的每个源文件构建到它自己的二进制文件中

我可以很好地构建库libproj.a,但无法弄清楚如何构建测试。我当前在尝试构建 /cygdrive/d/Source/proj/build/obj/test_proj.o:test_proj.c:(.text+0x15): undefined reference to 'test' 时收到以下链接器错误.

目录结构

+---build
| +---lib
| +---obj
| \---test
+---include
| \---proj
+---source
\---test

Makefile

PROJECT             = proj
LIBNAME = lib$(PROJECT).a

CFLAGS = -Wall -Wextra -O0

DIR_ROOT = $(abspath .)
DIR_SRC_LIB = $(DIR_ROOT)/source
DIR_SRC_TEST = $(DIR_ROOT)/test

DIR_BLD_OBJ = $(DIR_ROOT)/build/obj
DIR_BLD_LIB = $(DIR_ROOT)/build/lib
DIR_BLD_TEST = $(DIR_ROOT)/build/test

LST_OBJ_LIB = $(patsubst $(DIR_SRC_LIB)/%.c, $(DIR_BLD_OBJ)/%.o, $(wildcard $(DIR_SRC_LIB)/*.c))
LST_OBJ_TEST = $(patsubst $(DIR_SRC_TEST)/%.c, $(DIR_BLD_OBJ)/%.o, $(wildcard $(DIR_SRC_TEST)/*.c))
LST_BIN_TEST = $(patsubst $(DIR_SRC_TEST)/%.c, $(DIR_BLD_TEST)/%, $(wildcard $(DIR_SRC_TEST)/test_*.c))

INCLUDES = -I $(DIR_ROOT)/include

clean:
$(RM) $(LST_OBJ_LIB)
$(RM) $(LST_OBJ_TEST)

build:
$(info build)

build-test: $(LST_BIN_TEST)
$(info build-test)

run-test:
$(info run-test)

install:
$(info install)

$(LIBNAME): $(LST_OBJ_LIB)
$(AR) rvs $(DIR_BLD_LIB)/$@ $^

$(DIR_BLD_OBJ)/%.o: $(DIR_SRC_LIB)/%.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

$(DIR_BLD_TEST)/%: $(DIR_BLD_OBJ)/%.o $(LIBNAME)
$(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) -l $(PROJECT) $< -o $@

$(DIR_BLD_OBJ)/%.o: $(DIR_SRC_TEST)/%.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

最佳答案

我的猜测是这一行:

$(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) -l $(PROJECT) $< -o $@

是错误的。您将在目标文件之前将库传递给编译器(我假设是 gcc)。如果您的编译器像 gcc 那样工作,则库中的代码将被丢弃,因为在解析它们时尚未引用它 see -l option documentation .

应该是

$(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) $< -l $(PROJECT) -o $@

(注意 $< 的位置发生了变化)

此外,请记住库的顺序很重要:请参阅这个优秀的 explanation .

关于c - 使: create a test binary for each file in test directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com