将visual studio makefile转换为linux makefile 我是新的MaFrimes,刚刚创建了一个用于C++项目的MaFe文件。它有两个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

将visual studio makefile转换为linux makefile 我是新的MaFrimes,刚刚创建了一个用于C++项目的MaFe文件。它有两个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,makefile,Linux,Makefile,您还可以使用来完成任务: 将以下内容放入项目根目录中的CMakeLists.txt文件(): 然后在控制台上执行以下操作: “源代码内”构建 $cd $cmake。 $make 或“源代码外”构建 $mkdir $cd $cmake $make 您可以使用漂亮的GUI工具调整构建设置。只需转到build目录并运行cmakegui即可深入了解Linux上的make,请参阅 有一些不同之处。二进制文件没有扩展名 EXE = NumberGuessingGame 编译器是gcc,但不需要命名

您还可以使用来完成任务:

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

然后在控制台上执行以下操作:

  • “源代码内”构建

    $cd
    $cmake。
    $make
    
  • 或“源代码外”构建

    $mkdir
    $cd
    $cmake
    $make
    

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

即可深入了解Linux上的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

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

*** missing separator.  Stop.

或者其他一些奇怪的错误。

您不需要在依赖项列表中包含标题。编译器将自行失败,使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
.POSIX:
#CC已隐式定义。
CXX=g++
OBJ=game.o userInterface.o
STD_HEADERS=header.h
.后缀:
.后缀:.o.cpp.c
NumberGuessingGame:$(OBJ)$(标准标题)
$(CXX)$(CFLAGS)-o$@$(OBJ)$(LDFLAGS)
.cpp.o:$(标准标题)
$(CXX)$(CFLAGS)-c$<
#已经有一个隐式的.c.o规则,因此这里不需要它。
#准备完成重建
清洁:
-rm-f数字游戏*.o

正如yegorich所回答的,您可以使用像Cmake这样的构建系统。它更灵活,跨平台,可以在Windows上生成Unix Makefiles以及Nmake Makefiles和Visual Studio解决方案。

big one:linux中没有
del
。或者.exe…它是rm对吗?linux平台上有哪些工具?(如果您不确定,请尝试
make-v
g++-v
)此外,对象文件扩展名是
.o
(不是
.obj
),选项是用破折号而不是斜线指定的。(而且编译器不太可能与选项兼容;
-Fe
可能根本不是您想要的选项。)Make已经知道如何编译和链接,因此您真正需要的只是无法推断的依赖项,以及您需要的任何选项覆盖。
game.o: $(STD_HEADERS)
userInterface.o: $(STD_HEADERS)
clean:
    rm -f $(OBJ)
    rm -f $(EXE)
*** missing separator.  Stop.
.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