#c #linker #linker-errors
#c #компоновщик #компоновщик-ошибки
Вопрос:
Я использую Windows и mingw. это моя программа выглядит как
helloworld
|---include
| |---header1
| |---headerA.cpp
| |---headerA.h
| |---headerA.o
|---main.cpp
|---main.o
Я #include"header1/headerA.h"
успешно включил заголовок с помощью commamd: g -c main.cpp -I.include
но когда я попытался связать main.o
и headerA.o
с помощью command: g -o main main.o -I.includeheader1*.o
я перепробовал много команд, но получил ошибку:main.o:main.cpp :(.text 0x35): неопределенная ссылка на `foo()’ collect2.exe : ошибка: ld вернул 1 статус выхода. пожалуйста, скажите, как я могу связать их правильно. Я не хочу включать заголовок, подобный #include"C:/../headerA.h"
.
Ответ №1:
Согласно документации gcc, -I
флаг используется для передачи каталогов include, где компилятор будет искать заголовки. Вместо этого ваша ошибка — ошибка компоновщика. Это означает, что вы правильно скомпилировали свой модуль перевода, но когда компоновщик попытался разрешить символы, он не смог найти определения. Заголовки содержат только объявления, а не «мясо».
Вы просто перечисляете все файлы .o, которые вы хотели бы связать вместе: g main.o ./include/header1/headerA.o -o main
В качестве дополнительного примечания вам не следует помещать файлы .o в каталог / include вашего проекта. Желательно, чтобы вы создали выделенный каталог / build для объектных файлов (чтобы не испортить основной проект — вы же не хотели бы отправлять их в репозиторий, верно?).
Комментарии:
1. спасибо, сэр. У меня есть еще один вопрос, хочу ли я создать свой проект как для Windows, так и для Linux, используя разные make-файлы. возможно ли это? или вы можете рассказать мне, как создаются профессиональные независимые платформенные проекты?
2. Если вы используете mingw и придерживаетесь платформо-независимых конфигураций в своем коде, у вас не возникнет проблем с его сборкой как для Linux, так и для Windows, используя g напрямую, как вы делаете (и тот же makefile, я полагаю). Но вскоре у вас возникнет путаница с зависимостями, поэтому я рекомендую использовать scons или CMake . Они абстрагируются от инструкций компилятора, однако у них есть свой собственный синтаксис, который вы должны понять.