praktische aspekte der informatikbuilding with cmake •create cmakelists.txt file and a build...
TRANSCRIPT
![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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051809/600f3514b984ec0c041da4d3/html5/thumbnails/33.jpg)
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/