如何使用 cmake 添加不同的 header 文件夹以便项目正确编译和 运行

How to add different header folders with cmake so the project properly compiles and run

我正在使用 cmake 和 c 创建一个项目,我需要在其中包含来自不同文件夹的 headers,

#include <dbus/dbus.h>
#include <audacious/audctrl.h>
#include <audacious/dbus.h>
#include <pidgin/pidgin.h>

然后我将这些行添加到 cmake cofig 文件中:

target_include_directories(untitled PRIVATE
    /usr/include/dbus-1.0/;/usr/lib/x86_64-linux-gnu/dbus-1.0/include/;/usr/include/glib-2.0/;
    /usr/lib/x86_64-linux-gnu/glib-2.0/include/;/usr/include/gtk-3.0/;/usr/include/pango-1.0/;/usr/include/cairo/;
    /usr/include/gdk-pixbuf-2.0/;/usr/include/atk-1.0/
)

这是部分代码:

GError *gError = NULL;
DBusGConnection *dBusGConnection = dbus_g_bus_get(DBUS_BUS_SESSION,gError);
DBusGProxy *dBusGProxy = dbus_g_proxy_new_for_name(dBusGConnection,AUDACIOUS_DBUS_SERVICE,AUDACIOUS_DBUS_PATH,AUDACIOUS_DBUS_INTERFACE);
**audacious_remote_get_main_volume(dBusGProxy);**

但是当我尝试构建项目时 returns 这个错误:

 /usr/bin/ld: CMakeFiles/untitled.dir/main.c.o: en la función `main':
`main.c:(.text.startup+0x9): referencia a `dbus_g_bus_get' sin definir
/usr/bin/ld: main.c:(.text.startup+0x22): referencia a `dbus_g_proxy_new_for_name' sin definir
/usr/bin/ld: main.c:(.text.startup+0x2a): referencia a `audacious_remote_get_main_volume' sin definir
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/untitled.dir/build.make:84: untitled] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/untitled.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/untitled.dir/rule] Error 2
make: *** [Makefile:118: untitled] Error 2

我已经尝试了 Internet 上的所有示例,试图让它工作,但没有任何效果。 我是 C/C++ 这个世界的新人,我来自 Java,没有必要做这些事情。

如有任何帮助,我们将不胜感激。

当您输入 target_include_directories 时,它会为您找到相应的 headers。因此,当你编译时它没有抱怨你的 headers 这是因为你包含了它们在编译期间要找到的路径。

我的预感是您没有在静态链接期间指定库文件。如果您没有 dbus_g_bus_get() 之类的定义,那是因为这些文件的实际定义存在于库中。库可以静态链接或动态链接,并具有像 .a.so 这样的前缀。您可以在 /usr/lib/lib/usr/local 中找到这些文件,前提是您已经通过发行版的包管理器(例如 apt-getyum 安装了它们,或者您构建了他们来自源头。

要解决您的问题,您可能需要将以下内容添加到您的 cmake 文件中:

target_link_libraries(untitled <A> <B> ...)

其中 <A> 可以是前缀为 -L 的路径,也可以是库文件的实际绝对路径。