'undefined reference to' when using GTK with CMake
我正在尝试使用CMake构建基本的GTK代码(其教程之一),但是我一直在获得"对*的未定义引用",其中*是代码中的任何GTK函数。我试图照看相关的指南/教程,但大多数都与我所拥有的相似。
使用命令:
,可以从终端进行常规编译而不会出现问题
1 | g++ ./test.cpp -o test `pkg-config --cflags --libs gtk+-3.0` |
当我尝试使用CMake时,我的CMakeLists.txt是:
1 2 3 4 5 6 7 8 9 10 11 12 | cmake_minimum_required(VERSION 3.0.2) project(gtktest) find_package(PkgConfig REQUIRED) pkg_check_modules(GTK3 REQUIRED gtk+-3.0) include_directories(${GTK3_INCLUDE_DIRS}) link_directories(${GTK3_LIBRARY_DIRS}) add_definitions(${GTK3_CFLAGS_OTHER}) add_executable(gtktest test.cpp) target_link_libraries(gtktest ${GKT3_LIBRARIES}) |
现在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | cmake . -- The C compiler identification is GNU 7.4.0 -- The CXX compiler identification is GNU 7.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found PkgConfig: /usr/bin/pkg-config (found version"0.29.1") -- Checking for module 'gtk+-3.0' -- Found gtk+-3.0, version 3.22.30 -- Configuring done -- Generating done -- Build files have been written to: /home/dfdark/Desktop/gtk test |
但是之后出现命令是问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | make Scanning dependencies of target gtktest [ 50%] Building CXX object CMakeFiles/gtktest.dir/test.cpp.o [100%] Linking CXX executable gtktest CMakeFiles/gtktest.dir/test.cpp.o: In function `activate(_GtkApplication*, void*)': test.cpp:(.text+0x27): undefined reference to `gtk_application_window_new' test.cpp:(.text+0x30): undefined reference to `gtk_window_get_type' test.cpp:(.text+0x42): undefined reference to `g_type_check_instance_cast' test.cpp:(.text+0x51): undefined reference to `gtk_window_set_title' test.cpp:(.text+0x56): undefined reference to `gtk_window_get_type' test.cpp:(.text+0x68): undefined reference to `g_type_check_instance_cast' test.cpp:(.text+0x7a): undefined reference to `gtk_window_set_default_size' test.cpp:(.text+0x86): undefined reference to `gtk_widget_show_all' CMakeFiles/gtktest.dir/test.cpp.o: In function `main': test.cpp:(.text+0xcc): undefined reference to `gtk_application_new' test.cpp:(.text+0xfb): undefined reference to `g_signal_connect_data' test.cpp:(.text+0x100): undefined reference to `g_application_get_type' test.cpp:(.text+0x112): undefined reference to `g_type_check_instance_cast' test.cpp:(.text+0x126): undefined reference to `g_application_run' test.cpp:(.text+0x135): undefined reference to `g_object_unref' collect2: error: ld returned 1 exit status CMakeFiles/gtktest.dir/build.make:94: recipe for target 'gtktest' failed make[2]: *** [gtktest] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/gtktest.dir/all' failed make[1]: *** [CMakeFiles/gtktest.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2 |
test.cpp代码(来自GTK教程)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <gtk/gtk.h> static void activate (GtkApplication* app, gpointer user_data) { GtkWidget *window; window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window),"Window"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); gtk_widget_show_all (window); } int main (int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app,"activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; } |
问题是否弄乱了CMake命令的顺序?
在您的CMakeLists.txt中使用GTK而不是GTK3:
1 2 3 4 5 6 7 8 9 10 11 12 | cmake_minimum_required(VERSION 3.0.2) project(gtktest) find_package(PkgConfig REQUIRED) pkg_check_modules(GTK REQUIRED gtk+-3.0) include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) add_executable(gtktest test.cpp) target_link_libraries(gtktest ${GTK_LIBRARIES}) |