Adam Payne
Adam Payne

Reputation: 23

Converting a visual studio makefile to a linux makefile

i am new to makefiles and have just rescently created a makefile that works for a c++ project. it has two cpp files and one h file. i am trying to convert my file to work in linux but cant seem to figure out how. any ideas?

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

Upvotes: 2

Views: 935

Answers (3)

user539810
user539810

Reputation:

You don't need to include headers in the dependency list. The compiler will fail on its own, stopping make from continuing. However, if you're including them in the dependency list to force make to rebuild files in case the header changes, nobody will stop you.

CFLAGS never needs to contain -c, nor does LDFLAGS need -o. Below is a revamped makefile. Note that you can always override a macro explicitly defined in a makefile or implicitly defined using something like make CFLAGS=-Wall for example. I used the de facto standard CXX macro name in the event that you have C source files, which must be compiled using a C compiler (the value of the CC macro) instead of a C++ compiler.

.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

As yegorich answered, you can use a build system like Cmake. It is much more flexible, cross-platform, and can generate Unix Makefiles as well as Nmake Makefiles and Visual Studio solutions on Windows.

Upvotes: 0

yegorich
yegorich

Reputation: 4849

You can also use CMake to accomplish your task:

Put following into CMakeLists.txt file in the root directory of your project (<project-dir>):

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

Then on the console do

  • "in-source" build

    $ cd <project-dir>
    $ cmake .
    $ make
    
  • or "out-source" build

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

You can adjust build setting using nice GUI tool. Just go to the build directory and run cmake-gui.

Upvotes: 2

Olaf Dietsche
Olaf Dietsche

Reputation: 74028

For in depth treatment of make on Linux, see GNU make.

There are a few differences. Binaries have no extension

EXE = NumberGuessingGame

The compiler is gcc, but need not be named, because CC is built in, same goes for LD. But since your files are named .cpp, the appropriate compiler is g++, which is CXX in make.

Object files have extension .o

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

Compiler flags

CXXFLAGS = -c

The equivalent for /Fe is just -o, which is not specified as LDFLAGS, but spelled out on the linker command line.

Usually, you use the compiler for linking

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

You don't need to specify the rules for object creation, they are built in. Just specify the dependencies

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

del is called rm

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

One important point is, indentation is one tab character, no spaces. If you have spaces instead, make will complain about

*** missing separator.  Stop.

or some other strange error.

Upvotes: 3

Related Questions