Wie hinzufügen von compiler-Argumente mit CMake?
Habe ich mit dem Clion IDE und versuche, ein einfaches GTK-Programm zu kompilieren, es zu benutzen. Ich habe festgestellt, dass Clion verwendet CMake, so sind die Themen hier eher als mit der IDE selbst. Ich bin in der Lage, erfolgreich zu kompilieren und führen Sie das Programm direkt vom terminal, aber die haben schon erfolglos mit CMake.
Das problem ist einfach: wenn ich versuche zu kompilieren, der compiler kann nicht finden gtk.h, die sich in /usr/include/gtk-3.0/gtk/gtk.h
. Ich habe festgestellt, dass irgendwie der Befehl compiler-argument 'pkg-config --libs --cflags gtk+-3.0'
behebt dieses problem, aber ich habe nicht in der Lage gewesen, um dieses argument mit CMake.
Habe ich versucht:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} `pkg-config --libs --cflags gtk+-3.0`")
Aber bin erfüllt mit:
Linking CXX executable test
c++: error: `pkg-config: No such file or directory
c++: error: gtk+-3.0`: No such file or directory
c++: error: unrecognized command line option ‘--libs’
c++: error: unrecognized command line option ‘--cflags’
make[3]: *** [test] Error 1
make[2]: *** [CMakeFiles/test.dir/all] Error 2
make[1]: *** [CMakeFiles/test.dir/rule] Error 2
make: *** [test] Error 2
Irgendwelche Vorschläge?
Weitere Forschung hat gezeigt, diese tutorial genau auf das Problem, das ich habe. Es funktioniert wie ein Charme, aber das erscheint zu werfen viele scheinbar undefinierten Variablen in den mix. Kann mir jemand erklären, wie und warum das funktioniert?
# Set the name and the supported language of the project
project(hello-world C)
# Set the minimum version of cmake required to build this project
cmake_minimum_required(VERSION 2.6)
# Use the package PkgConfig to detect GTK+ headers/library files
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
# Setup CMake to use GTK+, tell the compiler where to look for headers
# and to the linker where to look for libraries
include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_LIBRARY_DIRS})
# Add other flags to the compiler
add_definitions(${GTK3_CFLAGS_OTHER})
# Add an executable compiled from hello.c
add_executable(hello main.c)
# Link the target to the GTK+ libraries
target_link_libraries(hello ${GTK3_LIBRARIES})
- Ich weiß es nicht, aber wenn Sie das tun bekommen Ihre Antwort, Hinweis: die include-Pfad und pkg-config-Linie nicht übereinstimmen. Möchten Sie die Verwendung von GTK+ 2 oder GTK+ 3? Dies wird wichtig sein, um Probleme zu vermeiden später.
- Danke. Ich fest, dass. Ich kopierte die Zeichenfolge, aus der eine website mit 2.0 und vergessen, zu Bearbeiten, zu reflektieren 3.0.
- Sie haben
/usr/include
imPATH
(Umwelt -) variable? Das ist überhaupt nicht nützlich. - Ich muss mich wohl geirrt, als ich schrieb, und möglicherweise dachte über
/usr/local..
. Ich weiß, dass zum Beispieliostream
befindet sich bei/usr/include/c++..
. Wenn ein solches Verzeichnis ist nicht im PFAD ist, wie der compiler wissen, wo diese Header? PATH
wird von der shell benutzt, für die Suche nach binaries. Der compiler verwendet eine eingebaute Standorte und Orte, gekennzeichnet durch die-I
Flagge.- Ist
http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
hier helfen? - Sie brauchen nicht die
link_directories
nennen, wenn Sie_LDFLAGS
stattLIBRARIES
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die FindPkgConfig Modul
bits in chevrons (
<...>
) müssen ersetzt werden, mit echten Wertenkönnen Sie mehr erfahren, mit
Grundsätzlich die
include(FindPkgConfig)
Linie bringt in ein paar Makros - es sorgt auch dafür, dass pkg-config in der Umgebung. Dann ein Anruf zupkg_check_modules
läuft effektivpkg-config
, analysiert den Ausgang und schafft eine suite von Variablen mit dem ersten argument als Stamm.Aus der Hilfe, dies ist eine grundlegende Liste (XPREFIX ist in der Regel die Stammzellen, die Sie liefern)
GTK_INCLUDE_DIRS
ein, und die anderen scheinbar undefiniert varaibles, definiert?Müssen Sie verstehen, dass, wenn Sie geben Sie manuell die Zusammenstellung Befehl
ist nicht wirklich ein argument an den compiler, sondern macht die shell pkg-config mit Argumenten und verwendet den Ausgang dieser Ausführung verwendet wird, wie Befehle an den compiler. Ich schlage vor, Sie geben einfach nur die pkg-config-Befehl in Ihrer shell aus, um zu sehen, was es gibt. E. g. auf meinem laptop ist es
und diese sind die tatsächlichen Argumente an den compiler.
CMake ist nicht eine shell, über. Es hat seinen eigenen Paket-Erkennung und-Konfiguration-Mechanismus. Siehe @kdopen Antwort für die details.