#c #c #makefile
#c #c #makefile
Вопрос:
У меня возникли проблемы с моим Makefile.
Я пытаюсь создать программу из 2 файлов — main.cpp которая содержит функцию main, и modules.c, которая содержит определения функций, вызываемых в main(). modules.c содержат только определения функций, без функции main.
Мой Makefile выглядит следующим образом:
CC := gcc
CXX := g
LINK := g -Wall
CFLAGS := -g
CXXFLAGS := -g
TARGET = program
$(TARGET): modules.o main.o
$(LINK) -o $@ $< -lpcap
clean:
rm *.o $(TARGET)
modules.o:
$(CC) $(CFLAGS) -c modules.c -o $@ $<
main.o:
$(CXX) $(CXXFLAGS) -c main.cpp -o $@ $<
Я включил «modules.h», который содержит все объявления функций, в мой main.cpp . Переменные CFLAGS и CXXFLAGS указывают на правильные пути, содержащие
Когда я пытаюсь выполнить с помощью этого Makefile, я получаю ошибку
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../ lib64/crt1.o: В функции ‘_start’:
(.text 0x20): неопределенная ссылка на ‘main’
Если я поменяю порядок модулей.o и main.o в моей строке $ (TARGET) я получаю ошибки, которые говорят «неопределенная ссылка на» функции, которые я определил в modules.c, в main.cpp .
Я не знаю, что не так.
Спасибо.
С уважением, Рейн
Комментарии:
1. У меня была похожая проблема, когда я неправильно написал
gcc -pipe
asgcc -pie
…
Ответ №1:
Используйте $^ вместо $< . Последняя содержит только первую зависимость (modules.o), поэтому main.o не связан с исполняемым файлом.
Комментарии:
1. Это решило проблему «неопределенной ссылки на main». Но теперь я получаю «неопределенную ссылку на» функции, которые я определил в modules.c, в main.cpp ошибка. В моем main.cpp Я включил modules.h и объявил функции в modules.c как внешние функции.
2. Попробуйте также скомпилировать код C с помощью g (хотя бы для тестирования). В C есть несколько интересных правил искажения имен, которые могут здесь столкнуться. Если это исправит проблему, загляните во ‘внешний «C»‘
Ответ №2:
Вот пара подсказок:
-o $@ $<
не требуется для файлов .o, поэтому удалите ее из этих целевых объектов.-Wall
имеет больше смысла, когда используется при компиляции без привязки. Поэтому я бы добавил ее вместо этого в строкуCC
andCXX
(или, лучше, вCFLAGS
andCXXFLAGS
).- чистый целевой объект должен быть зависимостью от
.PHONY
целевого объекта, чтобы вы могли выполнять его всегда (без предварительной проверки измененных зависимостей).
Если вы все еще получаете сообщение об отсутствии ссылок на ваши функции из modules.c, вероятно, вы пропускаете некоторые extern "C" ...
инструкции в main.cpp . Это потому, что внутреннее имя функций C вычисляется иначе, чем у функций C (я думаю, что C добавляет префиксы ко всем именам с пространством имен, именами классов и т.д.). Чтобы сообщить C , что определенную функцию можно найти, используя старое внутреннее имя для привязки, используйте внешнюю инструкцию «C».