Makefile:如何使用patsubst在命令末尾指定库名?

问题描述 投票:0回答:1

我是一个新的Makefile,C和Linux的新手。我正在使用gcc & ubuntu。当我试图用一个库的链接来编译代码时,我遇到了一个问题。

我的问题是这样的。我有。

a_tests.c & b_tests.c files in "tests" folder
lib.a file in "build" folder

以下是Makefile中与此问题相关的代码。

CFLAGS=-g -O2 -Wall -Wextra -Isrc -DNDEBUG $(OPTFLAGS)
TARGET=build/lib.a

TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))

tests: CFLAGS += $(TARGET)
tests: $(TESTS)

当编译测试文件时,会提示 "undefined reference to 'XXXfunction'"错误。因为后面执行的是

gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG build/lib.a tests/a_tests.c -o test/a_tests
gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG build/lib.a tests/b_tests.c -o test/b_tests

但是 "buildlib.a "应该放在输出文件名后面才能解决(如果我手动输入下面的命令,代码就会编译成功),即:"buildlib.a"。

gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG tests/a_tests.c -o test/a_tests build/lib.a 
gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG tests/b_tests.c -o test/b_tests build/lib.a 

但我不知道如何在Makefile中更改,我试过-l -L选项,但没有用。它会警告说 "找不到.a文件"。任何帮助将被感激。非常感谢你的帮助

c linux gcc makefile
1个回答
1
投票

把这个库定义为依赖关系,因为它就是一个。它将被附加在其他依赖项的末尾,这里是:源代码。

CFLAGS=-g -O2 -Wall -Wextra -Isrc -DNDEBUG $(OPTFLAGS)
TARGET=build/lib.a

TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(TEST_SRC:%.c=%)

tests: $(TESTS)

$(TESTS): $(TARGET)

这个库不需要在 输出文件但在取决于 输入文件.

makefile进一步简化。

  • 替换了 patsubst 用更简单的表达方式。
  • 移动了目标 tests 了,所以它被发现是第一个,因此是默认的目标。

祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.