我正在一个嵌入式系统上构建一个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的使用是多余的。