C Makefile Linking Error: Undefined reference to 'main'

C Makefile Linking Error: Undefined reference to 'main'

我试过浏览其他答案,不幸的是我没有找到任何人有完全相同的问题。我试图 link 两个 C 文件在一起,一个有一个头文件,另一个是主文件。尝试让我收到此错误时:

(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

下面是我用来编译的makefile

INC_DIR = include
SRC_DIR = src
BIN_DIR = bin
UNAME := $(shell uname)
CC = gcc
CFLAGS = -Wall -std=c11 -g -I$(INC_DIR) -I/usr/include/libxml2/
LDFLAGS= -L.

all: XMLParser

XMLParser: $(BIN_DIR)/XMLParser.o $(BIN_DIR)/SVGParser.o
    $(CC) $(CFLAGS) -o XMLParser $(BIN_DIR)/XMLParser.o $(BIN_DIR)/SVGParser.o

$(BIN_DIR)/XMLParser.o: $(SRC_DIR)/XMLParser.c $(INC_DIR)/SVGParser.h
    $(CC) $(CFLAGS) -o $(BIN_DIR)/XMLParser.o -c $(SRC_DIR)/XMLParser.c

$(BIN_DIR)/SVGParser.o: $(SRC_DIR)/SVGParser.c $(INC_DIR)/SVGParser.h
    $(CC) $(CFLAGS) `xml2-config --cflags --libs` -o $(BIN_DIR)/SVGParser.o $(SRC_DIR)/SVGParser.c

clean:
    rm *.o XMLParser $(BIN_DIR)/*

XMLParser.c 有我的主要功能:

int main(int argc, char **argv) {
  ...;
  return 0;
}

您生成中间体 SVGParser.o 的方法正在尝试 link 并生成可运行的可执行文件。您需要添加 -c 以跳过 link 步骤。

您还需要删除该目标文件上的 —libs 并将其移至最后的 link 步骤。换句话说,为生成最终 XMLParser 目标的规则添加 xml2-config —libs

免责声明:我从来没有专门使用过 xml2-config,所以我想我这里有可能是错的,但这是针对复杂库构建和 linking 的一种非常常见的范例,我假设它遵循相同的模式。

必须发布显示错误的完整示例代码才能在其他地方对其进行测试,因此我无法完全测试您的 makefile,但请提供真实的 main() 看看会发生什么。

在生成存根文件以检查您的 Makefile 之后,我发现 make 的以下输出:

$ make
gcc -Wall -std=c11 -g -Iinclude -I/usr/include/libxml2/ -o bin/XMLParser.o -c src/XMLParser.c
gcc -Wall -std=c11 -g -Iinclude -I/usr/include/libxml2/ `xml2-config --cflags --libs` -o bin/SVGParser.o src/SVGParser.c
/usr/local/bin/ld: /usr/lib/gcc/x86_64-unknown-freebsd13.0/10.2.1/../../../crt1.o: en la función `_start':
/home/usr/src/lib/csu/amd64/crt1_c.c:75: referencia a `main' sin definir
collect2: error: ld devolvió el estado de salida 1
*** Error code 1

Stop.
make: stopped in /home/lcu/so/makefile
$ _

它正在尝试 link(单独)模块 SVGParser.o(这是因为您没有添加 -c 编译选项以仅编译)。

更改 SVGParser.o 模块的编译行以使用 -c 仅编译选项,您将正确获得可​​执行文件。