我是一个新的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文件"。任何帮助将被感激。非常感谢你的帮助
把这个库定义为依赖关系,因为它就是一个。它将被附加在其他依赖项的末尾,这里是:源代码。
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
了,所以它被发现是第一个,因此是默认的目标。祝您好运!