如何使用 CMake 配置 DBus 依赖项
How to configure DBus dependencies with CMake
我是 CMake 和 DBus 的新手。我正在按照指南 here 进行编译和执行基本程序。
我 运行 遇到的第一个问题是我的程序找不到
<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。正如 here 和许多其他帖子所讨论的那样。
但是,我不知道如何配置CMakeLists.txt来达到类似的效果。
我的猜测是向 CMakeLists.txt 添加类似 find_package(dbus-1) 的内容。如果这是正确的,我将不得不编写自己的 Finddbus-1.cmake。这听起来正确吗?或者有更简单的方法吗?
如有指点,我将不胜感激。
您可以获得现有的 FindDBus.cmake
脚本(例如 this one),将其复制到您的项目中,然后用作
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_modules
与 find_library
结合使用,就像在引用的 Find
脚本中所做的那样。 That answer 描述了在 CMake 中使用 pkgconfig 结果的通用方法。
我是 CMake 和 DBus 的新手。我正在按照指南 here 进行编译和执行基本程序。
我 运行 遇到的第一个问题是我的程序找不到
<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。正如 here 和许多其他帖子所讨论的那样。
但是,我不知道如何配置CMakeLists.txt来达到类似的效果。
我的猜测是向 CMakeLists.txt 添加类似 find_package(dbus-1) 的内容。如果这是正确的,我将不得不编写自己的 Finddbus-1.cmake。这听起来正确吗?或者有更简单的方法吗?
如有指点,我将不胜感激。
您可以获得现有的 FindDBus.cmake
脚本(例如 this one),将其复制到您的项目中,然后用作
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_modules
与 find_library
结合使用,就像在引用的 Find
脚本中所做的那样。 That answer 描述了在 CMake 中使用 pkgconfig 结果的通用方法。