代码之家  ›  专栏  ›  技术社区  ›  Meniev

如何在特定文件夹中创建一个.o文件-Makefile?

  •  0
  • Meniev  · 技术社区  · 2 年前

    问题:

    我需要在特定文件夹中创建.o文件。但你知道,它们只是在我的main.cpp的同一个文件夹中创建的。

    生成文件:

    cversion = -std=c++23
    true = 1
    false = 0
    notfalse = 1
    ClassPath = ./test
    dotO = ./dotO
    
    output.exe: message.o main.o
        g++ $(cversion) main.o message.o -o output
    
    main.o: main.cpp
        g++ $(cversion) -c main.cpp
    
    message.o: message.cpp
        g++ $(cversion) -c message.cpp
    
    clean:
        @cls
        @echo Errasing...
        @del *.o 
        @del output.exe
        @echo Files have been erased.
    

    消息.h:

    int messageBox(int x, int y);
    

    消息.cpp:

    int messageBox(int x, int y){
        return x+y;
    }
    

    main.cpp:

    #include <iostream>
    #include "message.h"
    
    int main(){
        std::cout << messageBox(10, 50) << std::endl;
    }
    

    重要细节:

    OS : Windows
    Text Editor : VScode
    I am using mingw64 
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   Chris Dodd    2 年前

    如果你想把它们放在一个特定的文件夹里,你需要把它们放那里,然后从那里使用它们。所以把它们放在一个名为 folder 你需要这样的东西:

    output.exe: folder/message.o folder/main.o
        g++ $(cversion) folder/main.o folder/message.o -o output
    
    folder/main.o: main.cpp
        g++ $(cversion) -c main.cpp -o $@
    
    folder/message.o: message.cpp
        g++ $(cversion) -c message.cpp -o $@
    

    以上只是添加 folder/ 每次提到应该在文件夹中的文件的名称时。您可以通过GNU make使用模式规则(如果您使用的是GNU make)来简化这一点,并且 $^ 以避免重复所有依赖项

    output.exe: folder/message.o folder/main.o
        g++ $(cversion) $^ -o output
    
    folder/%.o: %.cpp
        g++ $(cversion) -c $< -o $@
    

    它们使用在每个规则中定义的单字符“helper”变量:

    • $@ 当前规则的目标
    • $^ 当前规则的依赖项
    • $< 当前规则的第一个依赖项
        2
  •  1
  •   Meniev    2 年前

    简单单词中的$^和$@

    示例:

    Test.o: Test.cpp
        g++ -c $^ -o $@
    
    • $^ mean:正确的参数(在示例中,Test.cpp)

    • $@ mean:左参数(在示例中,Test.o)

    如果你有两个或两个以上的论点,也是一样的:

    output.exe: main.o message.o
        g++ $(cversion) $^ -o $@
    

    $^ =main.o message.o(正确的参数)

    $@ =output.exe(左侧参数)

        3
  •  1
  •   HardcoreHenry    2 年前

    添加到@ChrisDodd上面的例子中,一个常见的约定是为目标文件夹使用一个变量,然后生成一个对象列表,如下所示:

    OBJ_DIR := folder
    SRCS := main.cpp message.cpp
    OBJS := $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(notdir $(SRCS))
    
    $(info Note: OBJS is $(OBJS))
    
    output.exe: $(OBJS)
        g++ $(cversion) $(OBJS) -o $@
    
    $(OBJS) : $(OBJ_DIR)/%.o : %.cpp
        g++ $(cversion) -c $< -o $@