Einstieg: std::thread unter Linux mit CMake

Einstieg: std::thread unter Linux mit CMake

Als Multi-Plattform-C++-Entwickler hat man es nicht leicht. Das war ja der Grund für die Projekte VISlib und die inzwischen begrabene TheLib. Aber die Zeiten sind besser geworden. Der C++11-Standard bringt viele schöne und praktische Klassen mit. Das vielleicht einzige was gerade wirklich fehlt sind IPC, RPC und fundamentalerweise Sockets. Was aber z.B. sehr schön und praktisch ist sind die ganzen neuen Threading-Klassen, allen voran std::thread.

Nun bin ich meines Zeichens eigentlich Entwickler unter Windows und portiere meine Codes regelmäßig auf die anderen Plattformen (Linuxe und manchmal OS X). Entsprechend gibt es immer mal wieder kleine Startschwierigkeiten. Beispielsweise als ich mit meinem ersten Test-Programm zu std::thread zum ersten Mal unter Ubuntu kompilieren wollte bekam ich die std::exception:

Operation not permitted

Nun, offensichtlich habe ich pthread reingelinkt, weil ich sonst das Binary gar nicht gelinkt gekriegt hätte. Aber irgendwas lief trotzdem schief. Also hieß es das allmächtige Internet fragen (und natürlich bei StackOverflow raus kommen): http://stackoverflow.com/questions/9945391/stdthread-creation-throws-exception

Als Quintessenz: Mal wieder ist es eine Reihenfolge-Frage der Parameter des Gcc, ein ständiges Ärgernis in meinen Augen:

Funktioniert nicht:

g++ -std=c++0x -lpthread -o test ./test.cpp

Funktioniert:

g++ -std=c++0x -o test ./test.cpp -lpthread

Benutzer user405725 hat es schön in seinem Kommentar zusammengefasst:

You generally have to specify libraries AFTER object files or they are not pulled in.

Ok. Soweit, so gut. Und wie sieht es mit CMake aus? StackOverflow: http://stackoverflow.com/questions/1620918/cmake-and-libpthread

Die Unterschiedlichen Lösungen können sich auch hier unterschiedlich auf die Reihenfolge der Parameter im Gcc-Aufruf auswirken. Macht man es ganz formal mit find_package:

cmake_minimum_required (VERSION 2.6)
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

dann funktioniert alles und macht einfach alles Richtig.

Sucht man stattdessen den kurzen Dienstweg und gibt einfach die Parameter selbst an, z.B.:

SET(CMAKE_CXX_FLAGS_DEBUG "... -lpthread")
SET(CMAKE_CXX_FLAGS_RELEASE "... -lpthread")

dann hat zumindest auf meiner Installation mein Gcc wieder die Parameter in der falschen Reihenfolge bekommen und das Testprogramm hat nicht funktioniert.

Ich mag CMake. Es tut einfach was es soll. Aber man darf nicht versuchen die eigenen Ideen gegen die Strukturen und Standards von CMake durchzudrücken. Das kann zwar zu einem gewissen Grad funktionieren, aber man handelt sich jede Menge Ärger ein. Folgt man aber einfach den Vorgaben von CMake, die praktisch immer ausreichen, dann funktioniert alles wunderbar.

1 Kommentar zu „Einstieg: std::thread unter Linux mit CMake

  1. With more up-to-date cmake versions (meaning >3.0) it’s better to use modern cmake-syntax like e.g.:

    find_package(Threads REQUIRED)
    target_link_libraries(myapp PRIVATE Threads::Threads)

    Then you usually don’t have to worry anymore about cmake variable, linker flags and so on.

    PS: I hope some form of markdown works here in this blog…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.