Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build...

33
Praktische Aspekte der Informatik Moritz Mühlhausen Prof. Marcus Magnor https://graphics.tu-bs.de/teaching/ss19/padi/

Transcript of Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build...

Page 1: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Praktische Aspekte

der InformatikMoritz Mühlhausen

Prof. Marcus Magnor

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 2: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Make, Libraries,

and Debuggingmake, cmake, libraries, gdb, and IDEs

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 3: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Further Reading

Warning!The following slides are meant to give you

a very superficial introduction.

If you want to learn more, have a look at:http://sslabmcs12.weebly.com/uploads/9/2/2/0/9220774/makefiletutorial.pdf

http://www.cmake.org/Wiki/CMake

http://www.cs.cmu.edu/~gilpin/tutorial

http://qt-project.org

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 4: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Outline

Make

CMake

Libraries

Debugging with gdb

Debugging with IDEs

Assignment

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 5: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with Make

• Benefits

Makes building your application easy

May define different “targets”

Targets may depend on each other

May contain Macros

Useful even for non-C++ projects (e.g. LaTeX)

• Drawbacks

Quickly becomes unwieldy for larger projects

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 6: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with Make

Makefile

CXX=g++

CXXFLAGS=-I. –g –std=c++11

EXE=worldbuilder

$(EXE): main.o Block.o Sphere.o WorldBuilder.o Vector3D.o

$(CXX) $(CXXFLAGS) -o $@ $^

main.o: main.cpp WorldBuilder.h WorldObject.h Block.h Sphere.h

$(CXX) $(CXXFLAGS) -c $<

Block.o: Block.cpp Block.h WorldObject.h Vector3D.h

$(CXX) $(CXXFLAGS) -c $<

[…]

Vector3D.o: Vector3D.cpp Vector3D.h

$(CXX) $(CXXFLAGS) -c $<

clean:

rm -f *.o *~ $(EXE)

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 7: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with Make

Makefile

CXX=g++

CXXFLAGS=-I. –g –std=c++11

EXE=worldbuilder

$(EXE): main.o Block.o Sphere.o WorldBuilder.o Vector3D.o

$(CXX) $(CXXFLAGS) -o $@ $^

main.o: main.cpp WorldBuilder.h WorldObject.h Block.h Sphere.h

$(CXX) $(CXXFLAGS) -c $<

Block.o: Block.cpp Block.h WorldObject.h Vector3D.h

$(CXX) $(CXXFLAGS) -c $<

[…]

Vector3D.o: Vector3D.cpp Vector3D.h

$(CXX) $(CXXFLAGS) -c $<

clean:

rm -f *.o *~ $(EXE)

Output value

All input values

First input value (usually *.cpp)

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 8: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with Make

Makefile

CXX=g++

CXXFLAGS=-I. –g –std=c++11

EXE=worldbuilder

$(EXE): main.o Block.o Sphere.o WorldBuilder.o Vector3D.o

$(CXX) $(CXXFLAGS) -o $@ $^

%.o: %.cpp

$(CXX) $(CXXFLAGS) -c $<

clean:

rm -f *.o *~ $(EXE)

Pro: Easier to read

Con: make does not know header dependencies

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 9: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Outline

Make

CMake

Libraries

Debugging with gdb

Debugging with IDEs

Assignment

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 10: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with CMake

• Benefits

Cross-platform “Meta-Make”

Simple Scripting Language

Works on multiple platforms with multiple build systems

Can create Makefile, VS Solutions, Eclipse Projects, …

Can create installer files (.deb, .dmg, .msi)

• Drawbacks

You still have to write it by hand

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 11: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with CMake

CMakeLists.txt

project(worldbuilder)

set(CMAKE_CXX_FLAGS "-g")

set(CMAKE_CXX_FLAGS_DEBUG)

set(worldbuilder_SOURCES

main.cpp

Block.cpp

Sphere.cpp

WorldBuilder.cpp

Vector3D.cpp)

add_executable(worldbuilder ${worldbuilder_SOURCES})

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 12: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building with CMake

• Create CMakeLists.txt file and a build folder

in your current directory.

• Move to the build folder and run: cmake ..

• If everything worked, run make to compile.

• Once Makefile is created, make also checks

for updates in CMakeLists.txt.

• To clean the cache just delete everything in the

build directory and run cmake .. again.

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 13: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

More Cross-Platform Building

• You may also want to try CMake alternatives

QMake (http://qt-project.org)

Ninja (https://martine.github.io/ninja)

Automake (http://www.gnu.org/software/automake)

and many more…

• You will have to develop cross-platform a lot!

• Learning to develop cross-platform today will save

you headaches in the future!

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 14: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Outline

Make

CMake

Libraries

Debugging with gdb

Debugging with IDEs

Assignment

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 15: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Static libraries (.a/.lib)

Static Libraries (.a/.lib)

• Benefits: No need for distributing

additional files.

No changes after compilation.

• Drawbacks: Increases the file size of

your binary.

Redundancy when used in multiple applications.

Shared Libraries (.so/.dll)

• Benefits: Keep your binaries small.

Can be shared between multiple apps.

• Drawbacks: May change after

compilation.

Application needs to know location of files during runtime.

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 16: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building Libraries

• Treat each library as a separate code project

Store them in separate directories

Use include path (I) and link path (L/l) flags

Use separate Makefiles

• Your main application then needs to know

Which libraries are used? (-l)

Where are the binaries (.a, .lib, …) stored? (-L)

Where are the headers (.h) stored? (-I)

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 17: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Building Libraries

CXX=g++

OBJEXPORTPATH=../libobjexport

OBJEXPORTLIB=objexport

CXXFLAGS=-Wall -I$(OBJEXPORTPATH)/include -g -c

LDFLAGS=-L$(OBJEXPORTPATH)/lib -l$(OBJEXPORTLIB) -g

EXE=my_application

$(EXE): main.o

$(CC) -o $@ $^ $(LDFLAGS)

main.o: main.cpp

$(CC) $(CCFLAGS) $<

[…]

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 18: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

CMake and libraries

• Find and use external libraries

Define CMAKE_MODULE_PATH

In there, a Find[lib].cmake file contains a script

to include the [lib] library.

Use target_link_libraries to link them

• Create and use your own library

ADD_LIBRARY(yourlib STATIC ${SOURCE_FILES})

• This week’s materials contain an example for

OpenCV using CMake.

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 19: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

External library: OpenCV

• May be installed on your system…

apt-get, rpgm, msi, setup.exe

• … or you may build it yourself

• You need:

Static or shared library

Header files

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 20: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

External library: OpenCV

INCPATH = -I/usr/include/opencv

LIBPATH = -L/usr/lib/

OPTIONS = -lcv -lcvaux -lcxcore -lhighgui -lstdc++

CCFLAGS = -Wall -g

EXE=assignment_04

$(EXE): main.o

g++ $(LIBPATH) $(OPTIONS) $^ -o $@

main.o: main.cpp

g++ $(INCPATH) $(CCFLAGS) -c $<

clean:

rm -f *.o *~ $(EXE) testsmooth.png

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 21: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Outline

Make

CMake

Libraries

Debugging with gdb

Debugging with IDEs

Assignment

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 22: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Assertions

• Assertions make your application crash…… but in a useful way!

#include <cassert>

void foo(float probability) {

assert(0.0f <= probability

&& probability <= 1.0f);

// do something ...

}

• Assertions can be easily disabled for release:

#define NDEBUG // or use the –DNDEBUG flag with g++

• Code in disabled assertions is not executed!

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 23: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Debugging with gdb

• gdb let’s you look at your program at runtime.

Variables

Call-stack

Breakpoints & Step-by-Step evaluation

• Requires debug symbols: -g

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 24: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Debugging with gdb

gdb ./our_application

(gdb) run

our_application: Conifer.cpp:31: virtual std::vector< Quad,

std::allocator<Quad> > Conifer::getQuads() const:

Assertion 'center.z > 0.0' failed.

(gdb) bt

#0 raise () from /lib/libc.so.6

#1 in abort () from /lib/libc.so.6

#2 in __assert_fail () from /lib/libc.so.6

#3 in Conifer::getQuads at Conifer.cpp:31

#4 in Estate::getQuads at Estate.cpp:32

#5 in main () at main.cpp:42

(gdb) up

#1 in abort () from /lib/libc.so.6

(gdb) up

#2 in __assert_fail () from /lib/libc.so.6

(gdb) up

#3 in Conifer::getQuads at Conifer.cpp:31

(gdb) display m_size->z

1: this->m_size->z = 0

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 25: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Outline

Make

CMake

Libraries

Debugging with gdb

Debugging with IDEs

Assignment

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 26: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Programming with IDEs

• IDEs make your life simple Auto-completion, refactoring, …

Build organization, debugging, …

KDevelop, MS Visual Studio, Xcode, …

• Qt Creator Combines Editor, Compiler, Debugger, …

Coherent user-interface.

Many comfort functions.

Free cross-platform IDE.

Works with or without Qt.

• But first, a brief look at QMake…

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 27: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Back to building: QMake

qttest.pro

CONFIG -= qt # We won't be using Qt

TEMPLATE = app # We're building an application...

TARGET = QtTest # ... and it's called “QtTest”

# Everything that ends in .h is a header file

HEADERS += *.h

# Everything that ends in .cpp is a source file

SOURCES += *.cpp

# Do not use this notation in a bigger project...

That’s all!

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 28: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Programming with IDEs

• Open your .pro file in Qt Creator

• Your build tools are in the bottom left corner:

You can see the current state of

your project: “Debug” or “Release”.

You can run your code,

debug your code,

and of course build your code

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 29: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Outline

Make

CMake

Libraries

Debugging with gdb

Debugging with IDEs

Assignment

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 30: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Assignment

A. Make it so!Download the new materials. It’s a solution of last week’s assignment.

1. Create a working Makefile and build the code.

2. Create a CMakeLists.txt file and build again using that.

3. Finally, create a QMake .pro file and build using the Qt Creator.

B. That code is broken!You may have noticed that the “solution” contains several bugs.

1. Figure them out using the command line gdb.

2. Then do the same using an IDE (e.g. Qt Creator)

3. Now take a moment to appreciate IDEs.

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 31: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Assignment

C. Create your first library

1. Modify the code to create a worldbuilder library.

Which files go into the library? Which do not?

2. Build your library and write a small application that links itYou may just recycle the old main.cpp.

3. Prepare your library for (imaginary) distribution

Remember, you have to distribute both your library’s object files

as well as all the necessary header files. You will also want a

CMake script that builds the library.

D. Try using another library!Download and build a library (SFML), and write a small application.

http://www.sfml-dev.org/

http://www.sfml-dev.org/documentation/2.3.2/

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 32: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Using SFML

https://graphics.tu-bs.de/teaching/ss19/padi/

Page 33: Praktische Aspekte der InformatikBuilding with CMake •Create CMakeLists.txt file and a build folder in your current directory. •Move to the build folder and run: cmake .. •If

Final remarks

• You will have to use at least one external library

in your project.

• If you want to make a tool

Take a closer look at Qt.

We will cover Qt and GUI-programming in the future.

• If you want to make a game

For 2D (beginner), have a look at: SFML, SDL, …

For 3D (advanced), have a look at: Ogre, Irrlicht, …

https://graphics.tu-bs.de/teaching/ss19/padi/