der Informatik Moritz Mhlhausen Prof. Marcus Magnor - - PowerPoint PPT Presentation

der informatik
SMART_READER_LITE
LIVE PREVIEW

der Informatik Moritz Mhlhausen Prof. Marcus Magnor - - PowerPoint PPT Presentation

Praktische Aspekte der Informatik Moritz Mhlhausen Prof. Marcus Magnor https://graphics.tu-bs.de/teaching/ss19/padi/ Make, Libraries, and Debugging make, cmake, libraries, gdb, and IDEs https://graphics.tu-bs.de/teaching/ss19/padi/


slide-1
SLIDE 1

Praktische Aspekte der Informatik

Moritz Mühlhausen

  • Prof. Marcus Magnor

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

slide-2
SLIDE 2

Make, Libraries, and Debugging

make, cmake, libraries, gdb, and IDEs

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

slide-3
SLIDE 3

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/

slide-4
SLIDE 4

Outline

Make CMake Libraries Debugging with gdb Debugging with IDEs Assignment

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

slide-5
SLIDE 5

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/

slide-6
SLIDE 6

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/

slide-7
SLIDE 7

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/

slide-8
SLIDE 8

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/

slide-9
SLIDE 9

Outline

Make CMake Libraries Debugging with gdb Debugging with IDEs Assignment

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

slide-10
SLIDE 10

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/

slide-11
SLIDE 11

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/

slide-12
SLIDE 12

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/

slide-13
SLIDE 13

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/

slide-14
SLIDE 14

Outline

Make CMake Libraries Debugging with gdb Debugging with IDEs Assignment

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

slide-15
SLIDE 15

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/

slide-16
SLIDE 16

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/

slide-17
SLIDE 17

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/

slide-18
SLIDE 18

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/

slide-19
SLIDE 19

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/

slide-20
SLIDE 20

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/

slide-21
SLIDE 21

Outline

Make CMake Libraries Debugging with gdb Debugging with IDEs Assignment

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

slide-22
SLIDE 22

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/

slide-23
SLIDE 23

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/

slide-24
SLIDE 24

Debugging with gdb

gdb ./our_application (gdb) run

  • ur_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/

slide-25
SLIDE 25

Outline

Make CMake Libraries Debugging with gdb Debugging with IDEs Assignment

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

slide-26
SLIDE 26

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/

slide-27
SLIDE 27

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/

slide-28
SLIDE 28

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/

slide-29
SLIDE 29

Outline

Make CMake Libraries Debugging with gdb Debugging with IDEs Assignment

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

slide-30
SLIDE 30

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/

slide-31
SLIDE 31

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 it

You 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/

slide-32
SLIDE 32

Using SFML

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

slide-33
SLIDE 33

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/