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
仅编译选项,您将正确获得可执行文件。
我试过浏览其他答案,不幸的是我没有找到任何人有完全相同的问题。我试图 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
仅编译选项,您将正确获得可执行文件。