Сборка CMake хороша на Windows, но не на Ubuntu - PullRequest
0 голосов
/ 19 июня 2020

У меня есть 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)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...