使对 WinMain 的未定义引用失败
Make Failed on Undefined Reference to WinMain
我在使用 GNU Make (v3.82.90) 构建我的应用程序时不断收到此链接器错误。我已经查看了关于 SO 的其他答案,但答案仍然让我望而却步。
gcc -o build obj/teos_init.o obj/teos_event.o obj/teos_task.o obj/teos_sem.o obj
/teos_linkedlist.o obj/teos_log.o -Iinc/pvt -Iinc/pub -fmax-errors=3 -std=c11
c:/libs/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../libmingw32.a(main.o):(.text.
startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
makefile:14: recipe for target 'build' failed
make: *** [build] Error 1
我的makefile是这样的...
INCDIR = inc/pvt inc/pub
SRCDIR = src
OBJDIR = obj
LIBDIR = lib
CC=gcc
CFLAGS := $(foreach d, $(INCDIR), -I$d) -fmax-errors=3 -std=c11
_SRC = teos_init.c teos_event.c teos_task.c teos_sem.c teos_linkedlist.c teos_log.c
_OBJ := $(subst $(SRCDIR),$(OBJDIR),$(_SRC:%.c=%.o))
OBJ := $(patsubst %,$(OBJDIR)/%,$(_OBJ))
build: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
$(OBJDIR)/%.o: $(SRCDIR)/%.c
@mkdir -p $(OBJDIR)
$(CC) -c -o $@ $< $(CFLAGS)
$(OBJ): $(DEPS)
.PHONY: clean
clean:
-rm -r $(OBJDIR)/*
这是我的主要功能:
int main( int argc, char *argv[] )
{
TEOS_ERROR err = TEOS_ERR_NO_ERROR;
err = TEOS_TaskPoolInit();
return err;
}
非常感谢任何建议。谢谢
更新
这不是重复的。 正如我做这个时所指出的 post, "I've looked at the other answers on SO, but the answer continues to elude me." 我'我正在尝试使用标准 C 库构建控制台应用程序,不是 Windows 应用程序。
鉴于您在评论中声称:
the main function is in main.c
并且 link 操作的输出(为清楚起见格式化)是
gcc -o build
obj/teos_init.o
obj/teos_event.o
obj/teos_task.o
obj/teos_sem.o
obj/teos_linkedlist.o
obj/teos_log.o
-Iinc/pvt -Iinc/pub -fmax-errors=3 -std=c11
很明显,您的 Makefile 没有 linking main.o
,因此您没有 main
函数。
原因是 main.c
未列在您的源文件列表中,link 的目标文件列表是从该列表构建的。
_SRC = teos_init.c teos_event.c teos_task.c teos_sem.c teos_linkedlist.c teos_log.c
# No main.c here
将 main.c 添加到该行的末尾,看看是否能解决任何问题。
我在使用 GNU Make (v3.82.90) 构建我的应用程序时不断收到此链接器错误。我已经查看了关于 SO 的其他答案,但答案仍然让我望而却步。
gcc -o build obj/teos_init.o obj/teos_event.o obj/teos_task.o obj/teos_sem.o obj
/teos_linkedlist.o obj/teos_log.o -Iinc/pvt -Iinc/pub -fmax-errors=3 -std=c11
c:/libs/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../libmingw32.a(main.o):(.text.
startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
makefile:14: recipe for target 'build' failed
make: *** [build] Error 1
我的makefile是这样的...
INCDIR = inc/pvt inc/pub
SRCDIR = src
OBJDIR = obj
LIBDIR = lib
CC=gcc
CFLAGS := $(foreach d, $(INCDIR), -I$d) -fmax-errors=3 -std=c11
_SRC = teos_init.c teos_event.c teos_task.c teos_sem.c teos_linkedlist.c teos_log.c
_OBJ := $(subst $(SRCDIR),$(OBJDIR),$(_SRC:%.c=%.o))
OBJ := $(patsubst %,$(OBJDIR)/%,$(_OBJ))
build: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
$(OBJDIR)/%.o: $(SRCDIR)/%.c
@mkdir -p $(OBJDIR)
$(CC) -c -o $@ $< $(CFLAGS)
$(OBJ): $(DEPS)
.PHONY: clean
clean:
-rm -r $(OBJDIR)/*
这是我的主要功能:
int main( int argc, char *argv[] )
{
TEOS_ERROR err = TEOS_ERR_NO_ERROR;
err = TEOS_TaskPoolInit();
return err;
}
非常感谢任何建议。谢谢
更新
这不是重复的。 正如我做这个时所指出的 post, "I've looked at the other answers on SO, but the answer continues to elude me." 我'我正在尝试使用标准 C 库构建控制台应用程序,不是 Windows 应用程序。
鉴于您在评论中声称:
the main function is in main.c
并且 link 操作的输出(为清楚起见格式化)是
gcc -o build
obj/teos_init.o
obj/teos_event.o
obj/teos_task.o
obj/teos_sem.o
obj/teos_linkedlist.o
obj/teos_log.o
-Iinc/pvt -Iinc/pub -fmax-errors=3 -std=c11
很明显,您的 Makefile 没有 linking main.o
,因此您没有 main
函数。
原因是 main.c
未列在您的源文件列表中,link 的目标文件列表是从该列表构建的。
_SRC = teos_init.c teos_event.c teos_task.c teos_sem.c teos_linkedlist.c teos_log.c
# No main.c here
将 main.c 添加到该行的末尾,看看是否能解决任何问题。