Почему Makefile не может найти каталоги - PullRequest
0 голосов
/ 03 июня 2019

Я не могу включить заголовок в мою тестовую программу, используя Makefile.

Я попытался попробовать относительные пути, используя -I, но безуспешно. Я новичок в Make и по какой-то причине мне трудно понять, как он используется.

мой код, test.cpp

#include <iostream>
#include <results/enumTest.h>

int main()
{
   return 0;
}

и мой Makefile:

CFLAGS = -Wall -g -Wextra -Wpedantic -std=gnu++11 -m64 -Iinclude

test: test.o
    gcc $(CFLAGS) -I/.. -o  test test.o 

test.o: test.cpp
    gcc $(CFLAGS) -I/.. -c test.cpp

моя структура каталогов:

/testDir/
  ./results/enuMtest.h
  ./test/test.cpp
  ./test/Makefile

Я надеюсь, что смогу скомпилировать, а затем запустить тестовое программное обеспечение, используя Makefile. Это более или менее учебник для меня.

Ответы [ 2 ]

6 голосов
/ 03 июня 2019

Ваш путь включения -I/.. недействителен.Вы пытаетесь получить доступ к родительскому каталогу корневого каталога, который не может существовать.Измените ваш Makefile, чтобы вместо него использовать относительные пути с помощью -I..

Это позволит получить доступ к родительскому каталогу, как и предполагалось:

CFLAGS = -Wall -g -Wextra -Wpedantic -std=gnu++11 -m64 -Iinclude

test: test.o
    g++ $(CFLAGS) -I.. -o  test test.o # Change here

test.o: test.cpp
    g++ $(CFLAGS) -I.. -c test.cpp # ...and here

Обратите внимание на удаленные слэши.

EDIT: Asкомментарий @Lightness, вы должны включать несистемные заголовки с "header.h" вместо <header.h>.Кроме того, поскольку вы пытаетесь скомпилировать программу на C ++, рекомендуется использовать g++ вместо gcc (я обновил это во фрагменте выше).

5 голосов
/ 03 июня 2019

Возможны несколько улучшений.

  • Вы пытаетесь установить путь включения для родительского каталога /, который / /
  • Вы пытаетесь скомпилировать программу на c ++, используя gccно не g ++
  • Вам не нужно (это все равно будет работать) устанавливать путь включения при связывании.(test: test.o)
  • Поскольку в указанном вами файловом дереве отсутствует каталог с именем include, вам также не нужно включать -Iclude в CFLAGS
  • Обычно вариант CFLAGS для C ++ имеет видс именем CXXFLAGS, но я не изменил его в модифицированном примере ниже.

Исправленный make-файл будет выглядеть так:

CFLAGS = -Wall -g -Wextra -Wpedantic -std=gnu++11 -m64

test: test.o
    g++ $(CFLAGS) -o  test test.o 

test.o: test.cpp
    g++ $(CFLAGS) -I.. -c test.cpp

В качестве дополнительного примечания:

#include "" вместо #include <> также будет работать.Разница в том, что "" ищет включенный файл относительно местоположения текущего исходного файла, в то время как <> использует каталоги, которые вы указываете с помощью -I.Найти более подробную информацию здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...