make-файл с файлами из разных папок (для C ++) - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь скомпилировать тестовый файл C ++, который должен компилироваться из файлов, которые находятся в соседних папках в структуре файла проекта. У меня есть следующее:

Project/TestFiles/makefile
Project/TestFiles/test.cpp
Project/OtherFiles/my_stuff.cpp
Project/OtherFiles/my_stuff.hpp

Для компиляции я пытаюсь оставить файл my_stuff.o в папке OtherFiles, поэтому, если у меня есть другие makefiles, им не придется перекомпилировать каждая отдельная версия.

Мой makefile выглядит следующим образом:

CC = g++
CFLAGS = -std=c++11 -Wall -Wcomment -Werror -Wextra -Weffc++ -pedantic

run: test.out

test.out: test.cpp catchMain.cpp ../OtherFiles/my_stuff.o
  $(CC) $(CFLAGS) $^ -o $@

my_stuff.o: ../OtherFiles/my_stuff.cpp ../OtherFiles/my_stuff.hpp
  $(CC) $(CFLAGS) -c $<

Некоторое время я думал, что эта установка работает, но потом у меня начались странные проблемы, и я не смог скомпилировать , Например, имея static const map произведенный error: expected ';' after top level declarator. Поначалу Inte rnet, казалось, указывало на то, что компиляторы Ma c иногда не могут компилировать static const map s со списками инициализации членов (на что он также жаловался, если я удалил часть static const). Однако, когда я закомментировал все, что связано с std::map (оставив makefile как описано выше) ИЛИ поместил все файлы в одну папку (переписав и makefile, и #include s в test.cpp) все в порядке, но я бы хотел использовать std::map s И выбранную файловую структуру. Да, и удаление лишних флажков предупреждения тоже не работает.

Есть идеи, как мне это сделать?

Редактировать

my_stuff.hpp:

namespace my_stuff {
   void function();
}

my_stuff.cpp:

#include "my_stuff.hpp"
#include <map>

namespace my_stuff {
  static const std::map<char, char> the_map {{'a', 'b'}, {'c', 'd'}};
  void my_function() {
    // map stuff
  }
}

Испытательная часть представляет собой как ваниль catchMain.cpp:

#define CATCH_CONFIG_MAIN
#include "../../Catch2/catch.hpp" //which is outside the project specifics

, так и фактические испытания, my_tests.cpp:

#include "../../Catch2/catch.hpp"
#include "../OtherFiles/my_stuff.hpp"
#include <map>

SCENARIO("", "") {
  GIVEN("") {
    WHEN("") {
      THEN("") {
        my_function();
        // Other stuff
      }
    }
  }
}

1 Ответ

0 голосов
/ 10 марта 2020

Как указывало @SM, вы должны изменить правило my_stuff.o, но вы должны изменить рецепт и цель, чтобы он действительно создал то, что вы хотите:

../OtherFiles/my_stuff.o: ../OtherFiles/my_stuff.cpp ../OtherFiles/my_stuff.hpp
    $(CC) $(CFLAGS) -c $< -o $@

В целом, вы должны понимать язык, прежде чем пытаться манипулировать им. Поменять местами патчи, чтобы увидеть, что работает - очень неэффективный способ написания кода.

...