Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Makefile:如何使用patsubst在命令末尾指定库名称_C_Linux_Gcc_Makefile - Fatal编程技术网

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

C Makefile:如何使用patsubst在命令末尾指定库名称,c,linux,gcc,makefile,C,Linux,Gcc,Makefile,我不熟悉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 TE

我不熟悉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)
编译测试文件时,将提示“未定义对'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”应该放在输出文件名之后以解决它(如果我手动键入以下命令,代码将被成功编译),即:


但我不知道如何在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
    向上移动,因此发现它是第一个,因此是默认目标

祝你好运

是否发布了完整的Makefile文件?是否确实要为找到的每个c文件创建一个程序?还是要编译所有c文件,将它们与库链接在一起并构建一个可执行文件?
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)