Ниже приведен мой 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'
Почему это так?
Позаботьтесь о замене пробелов табуляторами при использовании вырезания и вставки из кода здесь.
Мне это помогло. Спасибо!!!!
Ваше правило для test
неверно: он перезаписывает main.o
. должно быть
g++ -o test main.o $(LDFLAGS)
Или вы можете использовать встроенные переменные:
g++ -o $@ $^ $(LDFLAGS)
Теперь он выдает следующую ошибку: «Отсутствует разделитель. Стоп». на g ++ -o test main.o $ (LDFLAGS)
Заменены пробелы табуляциями.
Попробуйте изменить правило для исполняемого файла на
test: main.o
g++ -o $@ $^ $(LDFLAGS)
Теперь выдает такую ошибку: «Отсутствует разделитель. Стоп». на g ++ -o $ @ $ ^ $ (LDFLAGS)
Обязательно используйте вкладки для отступов в make-файлах. При копировании приведенного выше фрагмента будут вставлены пробелы.
Строка, создающая исполняемый файл, неверна.
test: main.o
g++ -o main.o $(LDFLAGS)
Здесь вы указываете g ++ сгенерировать исполняемый main.o
без объектных модулей. Среда выполнения C правильно скулит, что не может найти ни одной функции main
; даже если ему удалось выплюнуть исполняемый файл, он перезапишет ваш объектный модуль main.o
.
Вероятно, вы хотите:
test: main.o
g++ -o test main.o $(LDFLAGS)
что означает «сгенерировать исполняемый test
с помощью объектного модуля main.o
».
После изменения теста на g ++ -o test main.o $ (LDFLAGS) или g ++ -o $ @ $ ^ $ (LDFLAGS) я получаю «отсутствует разделитель. Стоп».