如何使用CMake配置DBus依赖项

swa*_*712 1 c++ dbus cmake

我是CMake和DBus的新手.我按照这里的指南进行操作,并编写和执行基本程序.

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

<dbus/dbus.h>
Run Code Online (Sandbox Code Playgroud)

我通过在我的CMakeList.txt中添加一些include目录解决了这个问题.目前,我的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} )
Run Code Online (Sandbox Code Playgroud)

现在,我的程序抱怨无法找到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>
Run Code Online (Sandbox Code Playgroud)

我知道解决方法是使用正确的命令行标志或pkg-config.正如这里讨论的和许多其他帖子.

但是,我不知道如何配置CMakeLists.txt以产生类似的效果.

我的猜测是将类似find_package(dbus-1)的内容添加到CMakeLists.txt中.如果这是正确的,我将不得不写自己的Finddbus-1.cmake.这听起来不错吗?或者有更简单的方法吗?

我会感激任何指针.

Tsy*_*rev 5

您可能会获得已存在的FindDBus.cmake脚本(例如,脚本),将其复制到您的项目中,然后使用as

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})
Run Code Online (Sandbox Code Playgroud)

或者,如您所知pkgconfig可以找到DBus,您可以使用CMake模块PkgConfig.实际上,FindDBus.cmake上面引用的脚本在其实现中使用PkgConfig模块.可能的用法可能是:

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

pkg_check_modules(DBUS 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})
Run Code Online (Sandbox Code Playgroud)

但是,link_directories建议不要使用,最好是target_link_libraries()调用库的绝对路径.这就是为什么最好结合pkg_check_modules使用find_library,就像在改进的Find脚本中一样.该答案描述了在CMake中使用pkgconfig的结果的通用方法.