У меня есть CMakeList для библиотеки, серийный проект и тестовое приложение ext, которое отлично работает на Windows, но не на Ubuntu.
Вот файл CMakeList:
cmake_minimum_required(VERSION 3.5)
project(serial)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
include_directories(include)
if (UNIX)
set(rt_LIBRARIES rt)
set(pthread_LIBRARIES pthread)
endif()
set(serial_SRCS
src/serial.cc
include/serial/serial.h
include/serial/v8stdint.h
)
ament_export_libraries(${PROJECT_NAME})
add_library(${PROJECT_NAME} ${serial_SRCS})
ament_target_dependencies(${PROJECT_NAME})
ament_export_include_directories(include)
ament_export_dependencies(ament_cmake)
if(UNIX)
message(STATUS "UNIX system build")
target_link_libraries(${PROJECT_NAME} rt)
target_link_libraries(${PROJECT_NAME} pthread)
else()
message(STATUS "Windows system build")
target_link_libraries(${PROJECT_NAME} setupapi)
endif()
add_executable(serial_example examples/serial_example.cc)
#add_dependencies(serial_example ${PROJECT_NAME})
target_link_libraries(serial_example ${PROJECT_NAME})
install(TARGETS ${PROJECT_NAME}
#DESTINATION lib/${PROJECT_NAME}
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include/${PROJECT_NAME}
)
install(FILES include/serial/serial.h include/serial/v8stdint.h
DESTINATION include/${PROJECT_NAME})
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION include/${PROJECT_NAME}
FILES_MATCHING PATTERN "*.h"
PATTERN ".git" EXCLUDE)
ament_package()
Хотя сборка прошла успешно на Windows. На моем Ubuntu есть ошибка ссылки на ошибку сборки, как показано ниже. Я вижу библиотеку libserial.a в каталоге сборки, но, похоже, есть проблема с созданием приложения serial_example и его связыванием с этой библиотекой. Если я закомментировал строки
#add_executable(serial_example examples/serial_example.cc)
#target_link_libraries(serial_example ${PROJECT_NAME})
, тогда сборка libserial.a хороша. Чего не хватало? Проблема, похоже, в том, что при связывании serial_example он не может найти libserial.a; но на самом деле он находился в каталоге, в котором сгенерированная сборка / находится на том же уровне, что и CMakeFiles /.
CMakeFiles/serial_example.dir/examples/serial_example.cc.o: In function `enumerate_ports()':
serial_example.cc:(.text+0x48): undefined reference to `serial::list_ports()'
libserial.a(serial.cc.o): In function `serial::Serial::Serial(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, serial::Timeout, serial::bytesize_t, serial::parity_t, serial::stopbits_t, serial::flowcontrol_t)':
serial.cc:(.text+0x62): undefined reference to `serial::Serial::SerialImpl::SerialImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, serial::bytesize_t, serial::parity_t, serial::stopbits_t, serial::flowcontrol_t)'