您的变量没有正确分离。
你需要为
编译器
的一组变量和标志中
连接器
在一组不同的变量中。例如:
LFLAGS := -I$(INCLUDE_DIR) -I"C:\MinGW\include" -L"C:\MinGW\x86_64-w64-mingw32\lib" -liphlpapi -lws2_32 -static-libgcc
这是错误的,因为
-I
是
编译器
选项,同时
-L
和
-l
是
连接器
选项。您不应该将它们放在同一个变量中,因为您不需要将编译器标志传递给链接器,也绝对不希望将链接器标志传递给编译器。
但是,您看到的链接错误的主要直接问题是,您必须将库(
-l....
)
之后
链接行中的对象文件。大多数链接器都是“单程”链接器,这意味着它们只链接在命令行上处理库时需要的符号,而链接器在处理对象文件之前不会知道库需要什么符号。
如果你想使用标准的make变量(当然,如果你不想的话,你不必这么做),你应该使用:
CC := gcc
CFLAGS := -m64 -fPIE -Wall -Wextra -Werror -pedantic -g3
CPPFLAGS := -I$(INCLUDE_DIR) -I"C:\MinGW\include"
LDFLAGS := -L"C:\MinGW\x86_64-w64-mingw32\lib"
LDLIBS := -liphlpapi -lws2_32 -static-libgcc
然后你会写:
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
$(TARGET): $(OBJ_FILES)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)