【问题标题】:makefile with files from different folders (for C++)包含来自不同文件夹的文件的生成文件(用于 C++)
【发布时间】:2020-06-22 16:26:57
【问题描述】:

我正在尝试编译一个 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。起初,Internet 似乎表明 Mac 编译器有时无法使用成员初始化列表编译 static const maps(如果我删除了 static const 部分,它也会抱怨)。但是,当我注释掉与std::map 相关的所有内容时(如上所述保留makefile)或将所有文件放在同一个文件夹中(重写makefile 以及@987654335 中的#includes @),一切正常,但我想同时使用 std::maps 和所选的文件结构。哦,删除额外的警告标志也不起作用。

有什么想法可以做到吗?

编辑

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
      }
    }
  }
}

【问题讨论】:

  • 目标test.out 永远找不到需要的../OtherFiles/my_stuff.o。目标my_stuff.o: 必须是../OtherFiles/my_stuff.o
  • 有什么办法可以做到这一点吗? 显示代码和完整的错误消息。
  • 子目录中是否也有 makefile?如果是这样,您也应该从顶级 makefile 中使用它们。 make -C subdir [target]
  • 一定要用make吗?你可能会发现 cmake 更容易
  • 那里,添加了一些代码。

标签: c++ c++11 makefile g++


【解决方案1】:

作为@S.M.指出,您必须更改my_stuff.o 规则,但您必须更改配方和目标,这样它才能真正构建您想要的东西:

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

更一般地说,您必须先了解该语言,然后再尝试操作它。交换补丁来看看什么是有效的,这是一种非常低效的代码编写方式。

【讨论】:

  • 虽然我不自称是专家,但我认为我对我的用例理解得足够好。我也不是随意交换点点滴滴,而是解决问题。我很困惑为什么当我添加某些代码或将它们全部放在同一个代码时它似乎会崩溃。不幸的是,您建议的解决方案不起作用并提供clang: error: no such file or directory: '../OtherFiles/my_stuff.o'。还有其他想法吗?
  • @GreatName:它还在做什么?它是否提供任何其他信息?它是否构建 `../OtherFiles/my_stuff.o'?
  • 它似乎在makefile的不同情况下使用不同的编译器。当我将文件拆分为单独的相邻文件夹时,它使用(我猜)一个较旧的文件夹,它没有最新的功能。如果这是准确的,我如何强制 make 比我已经拥有的更明确地使用某个编译器或版本?我用的是 Mac 终端,G++ --version:Apple LLVM version 9.1.0 (clang-902.0.39.2); Target: x86_64-apple-darwin17.7.0; Thread model: posix
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多