在make中未定义对“ main”的引用

时间:2018-08-10 07:14:17

标签: c++ makefile

以下是我的Makefile:

CFLAGS = -c -g -W -O3 -Wall -Werror -Wshadow \
-Wno-long-long -Wpointer-arith -D_REENTRANT \
-D_POSIX_PTHREAD_SEMANTICS -DLINUX2 \
-I ./lib_acl_cpp/include
BASE_PATH=./acl
LDFLAGS = -L$(BASE_PATH)/lib_acl_cpp/lib -l_acl_cpp \
-L$(BASE_PATH)/lib_protocol/lib -l_protocol \
-L$(BASE_PATH)/lib_acl/lib -l_acl \
-lpthread
test: main.o
   g++ -o main.o $(LDFLAGS)
main.o: main.cpp
   g++ $(CFLAGS) main.cpp -o main.o

以下是main.cpp:

#include<iostream>
using namespace std;

int main()
{
   cout<<"hello";
   return 0;
}

我遇到以下错误:

/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In 
function `_start':
(.text+0x20): undefined reference to `main'

为什么会这样?

3 个答案:

答案 0 :(得分:2)

您对test的规则是错误的:它覆盖了main.o。应该是

g++ -o test main.o $(LDFLAGS)

或者您可以使用built-in variables

g++ -o $@ $^ $(LDFLAGS)

答案 1 :(得分:1)

创建可执行文件的行是错误的。

def is_superuser(self):
    '''Access all the things'''
    if self.user.email in ["member1@xyz.com","member2@xyz.com"]:
        return True
    else:
        return False

在这里,您要告诉g ++从无对象模块开始生成可执行文件test: main.o g++ -o main.o $(LDFLAGS) 。 C运行时正确地抱怨它找不到任何main.o函数;即使它设法吐出一个可执行文件,它也会覆盖您的main对象模块。

您可能想要的是:

main.o

表示“使用test: main.o g++ -o test main.o $(LDFLAGS) 对象模块生成可执行文件test”。

答案 2 :(得分:0)

尝试将可执行文件的规则更改为

test: main.o
   g++ -o $@ $^ $(LDFLAGS)