【问题标题】:Makefile: how to specify library name at the end of command using patsubstMakefile:如何使用 patsubst 在命令末尾指定库名称
【发布时间】:2020-05-04 09:30:25
【问题描述】:

我是 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

但是应该在输出文件名后面加上“build/lib.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 文件”。任何帮助,将不胜感激。非常感谢您!

【问题讨论】:

  • 完整 Makefile 文件发布了吗?
  • 您真的要为每个找到的 c 文件创建一个程序吗?还是您想编译所有 c 文件,将它们与库链接在一起并构建一个可执行文件?

标签: c linux gcc makefile


【解决方案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 上移,因此它是第一个目标,因此是默认目标。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多