用于组件测试和项目构建的CMake子模块-子模块构建但项目不

时间:2019-04-09 20:47:19

标签: c++ ubuntu cmake nvidia-jetson

我正在一个嵌入式系统上构建一个c ++程序,该系统具有多个连接到运行Ubuntu的Nvidia Jetson的硬件设备。我已将项目分解为4个子模块,这些子模块内置于库中并测试可执行文件并与主程序链接。

我的问题确实是,我的冗余在哪里/如何减轻,这甚至是与主程序一起构建测试程序的典型方法吗?

由于我对CMake相当陌生,并且希望变得更好,所以任何观点都将受到赞赏!

Here is my file directory
visionpro-device-xray
| -> CMakeLists.txt
| -> visionpro-xray-main.cpp
| -> src
     | -> common
          | -> utils.h
          | -> utils.cpp
     | -> data_management
          | -> CMakeLists.txt
          | -> data_management.h
          | -> data_management.cpp
          | -> test_data_management.cpp
     | -> hardware_interface
          | -> CMakeLists.txt
          | -> hardware_interface.h
          | -> hardware_interface.cpp
          | -> test_hardware_interface.cpp
     | -> state_monitor
          | -> CMakeLists.txt
          | -> state_monitor.h
          | -> state_monitor.cpp
          | -> test_state_monitor.cpp
     | -> user_interface_interface
          | -> CMakeLists.txt
          | -> user_interface.h
          | -> user_interface.cpp
          | -> test_user_interface.cpp

当前,我正在使用add_subdirectory构建子模块测试和库。但是我发现自己仍然将大多数find_package,include_directories和link_libraries复制到我的主要CMakeLists.txt

中。

这是根目录CMakeLists.txt

cmake_minimum_required(VERSION 3.2.2)
SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(visionproXray)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/src/hardware_interface/cmake" "${CMAKE_MODULE_PATH}")

add_subdirectory(src/hardware_interface)
add_subdirectory(src/user_device_interface)
add_subdirectory(src/data_management)
add_subdirectory(src/state_monitor)

#####################################################################
#               Including Packages
#####################################################################
find_package(PkgConfig REQUIRED)

find_package(Argus REQUIRED)
link_directories(${Argus_INCLUDE_DIR})

find_package(Boost REQUIRED COMPONENTS system)
link_directories(${Boost_LIBRARY_DIR})

find_package(CImg REQUIRED)
link_directories(${CImg_SYSTEM_LIBS_DIR})

find_package(EGL REQUIRED)
include_directories(${EGL_INCLUDE_DIR})
link_directories(${EGL_LIBRARY_DIR})

pkg_check_modules(GLIB REQUIRED glib-2.0)
include_directories(${GLIB_INCLUDE_DIR})
link_directories(${GLIB_LIBRARY_DIR})

pkg_check_modules(GTK2 REQUIRED gtk+-2.0)
include_directories(${GTK2_INCLUDE_DIR})
link_directories(${GTK2_LIBRARY_DIR})

pkg_check_modules(DBUS REQUIRED dbus-1)
include_directories(${DBUS_INCLUDE_DIR})
link_directories(${DBUS_LIBARY_DIR})

pkg_check_modules(DBUSGLIB REQUIRED dbus-glib-1)
include_directories(${DBUSGLIB_INCLUDE_DIR})
link_directories(${DBUSGLIB_LIBRARY_DIR})

pkg_check_modules(GOBJECT REQUIRED gobject-2.0)
include_directories(${GOBJECT_INCLUDE_DIR})
link_directories(${GOBJECT_LIBRARY_DIR})

find_package(JPEG REQUIRED)
include_directories(${JPEG_INCLUDE_DIR})

find_package(OpenGLES REQUIRED)
link_directories(${OPENGLES_INCLUDE_DIR})

find_package(X11 REQUIRED)
link_directories(${X11_INCLUDE_DIR})

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

link_directories(/usr/lib/aarch64-linux-gnu/tegra/)

#####################################################################
#               Executable
#####################################################################
file (GLOB COMMON_SOURCES "scr/common/*.cpp")
file (GLOB COMMON_HEADERS "scr/common/*.h")

add_executable(${PROJECT_NAME}
    src/visionpro-xray-main.cpp
    ${COMMON_SOURCES}
    ${COMMON_HEADERS}
)

#####################################################################
#               Include Directories
#####################################################################
target_include_directories(
    ${PROJECT_NAME}
    ${Argus_INCLUDE_DIR}
    ${Boost_INCLUDE_DIR}
    ${CImg_INCLUDE_DIR}
    ${DBUS_INCLUDE_DIR}
    ${DBUSGLIB_INCLUDE_DIR}
    ${EGL_INCLUDE_DIR}
    ${GLIB_INCLUDE_DIR}
    ${GTK2_INCLUDE_DIR}
    ${GOBJECT_INCLUDE_DIR}
    ${JPEG_INCLUDE_DIR}
    ${OPENGLES_INCLUDE_DIR}
    ${X11_INCLUDE_DIR}
)

#####################################################################
#               Link Libraries
#####################################################################
target_link_libraries( ${PROJECT_NAME}
    ${ARGUS_LIBRARIES}
    ${Boost_LIBRARIES}
    ${CImg_SYSTEM_LIBS}
    ${DBUS_LIBRARIES}
    ${DBUSGLIB_LIBRARIES}
    ${EGL_LIBRARY}
    ${GLIB_LIBRARIES}
    ${GOBJECT_LIBRARIES}
    ${GTK2_LIBRARIES}
    ${JPEG_LIBRARIES}
    ${OPENGLES_LIBRARIES}
    ${X11_LIBRARIES}
    nvbuf_utils
    DataManagement
    HardwareInterface
    StateMonitor
    UserDeviceInterface
    RTIMULib
    Threads::Threads
    Boost::system
    -lXi 
    -lXxf86vm 
    -lXinerama 
    -lXcursor 
    -lXfixes 
    -lXrandr 
    -lXext 
    -lXrender 
    -lX11 
    -lpthread 
    -lxcb 
    -lXau
)

include(CPack)

这是data_management模块的CMakeLists.txt

cmake_minimum_required(VERSION 3.2.2)
SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE Debug)

project(TestDataManagement)

add_library(DataManagement
    file_upload.cpp
    file_upload.h
    path_parser.h
)

add_executable(
    ${PROJECT_NAME}
    test_file_upload.cpp
)

TARGET_LINK_LIBRARIES( 
    ${PROJECT_NAME}
    DataManagement
)

更复杂的CMakeLists.txt实际上是让我认为我没有效率地完成所有这些工作的是hardware_interface CMakeLists.txt

cmake_minimum_required(VERSION 3.2.2)
SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(TestHardwareInterface)

set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")

#####################################################################
#               Including Packages
#####################################################################
find_package(Argus REQUIRED)
find_package(EGL REQUIRED)
find_package(OpenGLES REQUIRED)
message(STATUS "hardware_interface | PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message(STATUS "hardware_interface | CMAKE_SOURCE_DIR  : ${CMAKE_SOURCE_DIR}")
message(STATUS "hardware_interface | ARGUS_LIBRARIES   : ${ARGUS_LIBRARIES}")
message(STATUS "hardware_interface | ARGUS_INCLUDE_DIR : ${ARGUS_INCLUDE_DIR}")

find_package(Boost REQUIRED COMPONENTS system)
link_directories(${Boost_LIBRARY_DIR})

find_package(CImg REQUIRED)
link_directories(${CImg_SYSTEM_LIBS_DIR})

find_package(EGL REQUIRED)

find_package(OpenGLES REQUIRED)
link_directories(${OPENGLES_INCLUDE_DIR})

find_package(X11 REQUIRED)
link_directories(${X11_INCLUDE_DIR})

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

add_subdirectory(RTIMULib)

include_directories(
    ../common
    ${ARGUS_INCLUDE_DIR}
    ${Boost_INCLUDE_DIR}
    ${CImg_INCLUDE_DIRS}
    ${EGL_INCLUDE_DIR}
    ${OPENGLES_INCLUDE_DIR}
    ${RTIMULib_INCLUDE_DIR}
    ${X11_INCLUDE_DIR}
)

#####################################################################
#               Executable
#####################################################################
set(TEST_SOURCES
    test_hardware_interface.cpp
)

add_library( HardwareInterface 
    arduino_interface.cpp
    arduino_serial_communication.cpp
    camera_rgb.cpp
    camera_thermal.cpp
    CImg.h
    hardware_event_controller.cpp
    imu.cpp
    lidar.cpp
    v4l2_utility.cpp
    ../common/utilities.cpp
)

add_executable( ${PROJECT_NAME}
    ${TEST_SOURCES}
    ../common/utilities.cpp
)

target_include_directories(
    ${PROJECT_NAME}
    PUBLIC ${Argus_INCLUDE_DIR}
    PUBLIC ${Boost_INCLUDE_DIR}
    PUBLIC ${CImg_INCLUDE_DIR}
    PUBLIC ${EGL_INCLUDE_DIR}
    PUBLIC ${OPENGLES_INCLUDE_DIR}
    PUBLIC ${X11_INCLUDE_DIR}
)

target_link_libraries(  ${PROJECT_NAME}
    HardwareInterface
    RTIMULib
    ${ARGUS_LIBRARIES}
    ${Boost_LIBRARIES}
    ${CImg_SYSTEM_LIBS}
    ${OPENGLES_LIBRARIES}
    ${X11_LIBRARIES}
    Boost::system
    Threads::Threads
)

install(TARGETS ${PROJECT_NAME} DESTINATION bin)

include(CPack)

我知道至少在一个地方,取决于作用域,include_directories和target_include_directories的使用是多余的。

0 个答案:

没有答案