как связать объектный файл из другого каталога с помощью cmd?

#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 . Они абстрагируются от инструкций компилятора, однако у них есть свой собственный синтаксис, который вы должны понять.