【问题标题】:Converting a visual studio makefile to a linux makefile将 Visual Studio 生成文件转换为 linux 生成文件
【发布时间】:2014-02-09 03:39:24
【问题描述】:

我是 makefile 的新手,最近刚刚创建了一个适用于 c++ 项目的 makefile。它有两个 cpp 文件和一个 h 文件。我正在尝试将我的文件转换为在 linux 中工作,但似乎无法弄清楚如何。有什么想法吗?

EXE = NumberGuessingGame.exe
CC = cl
LD = cl
OBJ = game.obj userInterface.obj
STD_HEADERS = header.h
CFLAGS = /c
LDFLAGS = /Fe

$(EXE): $(OBJ)
    $(LD) $(OBJ) $(LDFLAGS)$(EXE)

game.obj: game.cpp $(STD_HEADERS)
    $(CC) game.cpp $(CFLAGS)

userInterface.obj: userInterface.cpp $(STD_HEADERS)
    $(CC) userInterface.cpp $(CFLAGS)

#prepare for complete rebuild
clean:
    del /q *.obj
    del /q *.exe

【问题讨论】:

  • 一大:在linux中没有del。或 .exe...
  • 它的 rm 对吗?而不是del
  • linux平台有哪些工具? (如果您不确定,请尝试make -vg++ -v。)
  • 另外,目标文件扩展名是.o(不是.obj),选项用破折号而不是斜杠指定。 (而且编译器不太可能与选项兼容;-Fe 可能根本不是您想要的选项。)
  • Make 已经知道如何编译和链接,因此您真正需要的只是无法推断的依赖项,并且您需要的任何选项都会覆盖。

标签: linux makefile


【解决方案1】:

有关 Linux 上 make 的深入处理,请参阅GNU make

有一些不同之处。二进制文件没有扩展名

EXE = NumberGuessingGame

编译器是gcc,但不需要命名,因为CC是内置的,LD也是如此。但是因为你的文件被命名为.cpp,所以合适的编译器是g++,在make中是CXX

对象文件的扩展名为.o

OBJ = game.o userInterface.o
STD_HEADERS = header.h

编译器标志

CXXFLAGS = -c

/Fe 的等价物只是-o,它没有指定为LDFLAGS,而是在链接器命令行上拼写出来。

通常,您使用编译器进行链接

$(EXE): $(OBJ)
    $(CXX) $(LDFLAGS) $(OBJ) -o $(EXE)

创建对象的规则不需要指定,它们是内置的,指定依赖即可

game.o: $(STD_HEADERS)
userInterface.o: $(STD_HEADERS)

del 被称为rm

clean:
    rm -f $(OBJ)
    rm -f $(EXE)

重要的一点是,缩进是一个制表符字符,没有个空格。如果你有空格,make 会抱怨

*** missing separator.  Stop.

或其他一些奇怪的错误。

【讨论】:

    【解决方案2】:

    您也可以使用CMake 来完成您的任务:

    将以下内容放入项目根目录(<project-dir>)的 CMakeLists.txt 文件中:

    cmake_minimum_required (VERSION 2.6)
    project (NumberGuessingGame)
    add_executable(NumberGuessingGame game.cpp serInterface.cpp)
    

    然后在控制台上做

    • “源内”构建

      $ cd <project-dir>
      $ cmake .
      $ make
      
    • 或“外包”构建

      $ mkdir <build-dir>
      $ cd <build-dir>
      $ cmake <project-dir>
      $ make
      

    您可以使用漂亮的 GUI 工具调整构建设置。只需转到构建目录并运行cmake-gui

    【讨论】:

      【解决方案3】:

      您不需要在依赖项列表中包含标题。编译器将自行失败,停止 make 继续。但是,如果您将它们包含在依赖项列表中以强制 make 重建文件以防标头更改,那么没有人会阻止您。

      CFLAGS 永远不需要包含 -c,LDFLAGS 也不需要 -o。下面是修改后的makefile。请注意,您始终可以覆盖在 makefile 中显式定义的宏或使用 make CFLAGS=-Wall 之类的隐式定义的宏。如果您有 C 源文件,我使用事实上的标准 CXX 宏名称,它必须使用 C 编译器(CC 宏的值)而不是 C++ 编译器进行编译。

      .POSIX:
      
      #CC is already implicitly defined.
      CXX = g++
      OBJ = game.o userInterface.o
      STD_HEADERS = header.h
      
      .SUFFIXES:
      .SUFFIXES: .o .cpp .c
      
      NumberGuessingGame: $(OBJ) $(STD_HEADERS)
          $(CXX) $(CFLAGS) -o $@ $(OBJ) $(LDFLAGS)
      
      .cpp.o: $(STD_HEADERS)
          $(CXX) $(CFLAGS) -c $<
      
      #There is already an implicit .c.o rule, thus there is no need for it here.
      
      #prepare for complete rebuild
      clean:
          -rm -f NumberGuessingGame *.o
      

      正如 yegorich 所回答的,您可以使用 Cmake 之类的构建系统。它更加灵活、跨平台,并且可以在 Windows 上生成 Unix Makefile 以及 Nmake Makefile 和 Visual Studio 解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 2011-02-13
        • 2012-01-16
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多