如何使用CMake配置DBus依赖项

6

我对CMake和DBus都很陌生。我正按照这里的指南(链接)编写一个基本程序并使其编译并运行。

我遇到的第一个问题是我的程序找不到

<dbus/dbus.h>

我通过向我的 CMakeList.txt 添加一些包含目录来解决了这个问题。目前,我的 CMakeLists.txt 如下:

...

include_directories(/usr/lib/)
include_directories(/usr/include/dbus-1.0/)
include_directories(/usr/lib/x86_64-linux-gnu/dbus-1.0/include)
include_directories(/usr/include/glib-2.0)
include_directories(/usr/lib/x86_64-linux-gnu/glib-2.0/include/)

set (LIBS
  dbus-1
  dbus-glib-1
)

add_executable(mydbus mydbus.cpp)

target_link_libraries(mydbus ${LIBS} )

现在,我的程序抱怨找不到 dbus-arch-deps.h 文件。

/usr/include/dbus-1.0/dbus/dbus.h:29:33: fatal error: dbus/dbus-arch-deps.h: No such file or directory
 #include <dbus/dbus-arch-deps.h>

我知道解决这个问题的方法是使用正确的命令行标志或pkg-config。就像在这里和其他大量帖子中所讨论的那样。
但是,我不知道如何配置CMakeLists.txt以获得类似的效果。
我的猜测是在CMakeLists.txt中添加类似于find_package(dbus-1)的内容。如果我的想法正确,我将不得不编写自己的Finddbus-1.cmake。这听起来正确吗?还是有更简单的方法吗?
我将非常感谢任何指导。
1个回答

14

您可以获取现有的FindDBus.cmake脚本(例如,此处),将其复制到您的项目中,并使用如下:

find_package(DBus REQUIRED)
# Use results of find_package() call.
include_directories(${DBUS_INCLUDE_DIRS})

add_executable(mydbus mydbus.cpp)

target_link_libraries(mydbus ${DBUS_LIBRARIES})

另外,正如您所知,pkgconfig 可以找到 DBus,您可以使用 CMake 模块 PkgConfig。实际上,上面提到的 FindDBus.cmake 脚本在其实现中使用了 PkgConfig 模块。可能的用法如下:

find_package(PkgConfig REQUIRED) # Include functions provided by PkgConfig module.

pkg_check_modules(DBUS REQUIRED dbus-1) # This calls pkgconfig with appropriate arguments
# Use results of pkg_check_modules() call.
include_directories(${DBUS_INCLUDE_DIRS})
link_directories(${DBUS_LIBRARY_DIRS})

add_executable(mydbus mydbus.cpp)

target_link_libraries(mydbus ${DBUS_LIBRARIES})

然而,不推荐使用link_directories,最好在target_link_libraries()调用中使用绝对路径来引用库。这就是为什么最好将pkg_check_modulesfind_library结合使用,就像所引用的Find脚本中所做的那样。 该回答描述了在CMake中使用pkgconfig结果的通用方法。


感谢您抽出时间回答。不幸的是,那个解决方案对我没有用。CMake阶段进行得很顺利,并生成了一个Makefile。但是,当我执行make时,就会出现错误。我尝试包含/usr/lib/i386-linux-gnu/dbus-1.0/include/dbus,因为这就是这个文件所在的位置。但我仍然收到错误信息。 - sdevikar
文件包含为<dbus/dbus-arch-deps.h>,因此包含路径不应包含尾随的dbus子目录。顺便问一下,在您的机器上,头文件dbus-arch-deps.h的确切路径是什么? - Tsyvarev
非常感谢!那个建议似乎起作用了。此外,我还必须包括glibconfig.h的目录路径。不过我在想..我是不是在正确地做事情?也就是说,根据程序的复杂性,可能会有数十个头文件依赖项。而在我的情况下,find_package(PkgConfig)没有帮助。那么,如何配置我的CMake以实现与在命令行上执行pkg-config --cflags --libs glib-2.0相同的行为呢? - sdevikar
1
我已经更新了我的答案,并提供了更详细的示例,介绍如何使用find_package()pkg_check_modules在DBus中进行搜索。pkg_check_modules也可以应用于glib-2.0,这将产生pkg-config的效果。 - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接