Не удается правильно связать библиотеки в CMakeLists - PullRequest
0 голосов
/ 07 ноября 2019

У меня проблемы с связыванием исходных файлов (я добавил их в качестве библиотек в свои списки CMakeLists) с моим основным файлом. Вот мой CMakeLists:

cmake_minimum_required(VERSION 2.8.3)
project(ros_bridge)

set(${PROJECT_NAME}_CATKIN_COMPONENTS
  nav_msgs
  roscpp
  sensor_msgs
  std_msgs
)

add_compile_options(-std=c++14)

find_package(catkin REQUIRED COMPONENTS ${${PROJECT_NAME}_CATKIN_COMPONENTS})
find_package(RapidJSON REQUIRED)

catkin_package(
  INCLUDE_DIRS
    include
    include/aws_iot_sdk
    include/common
    include/network
  CATKIN_DEPENDS ${${PROJECT_NAME}_CATKIN_COMPONENTS}
)


include_directories(
  include
  include/aws_iot_sdk
  ${catkin_INCLUDE_DIRS}
)

## Libraries

add_library(ros_client src/ros_client.cpp)
add_library(ConfigCommon include/common/ConfigCommon.cpp)
add_library(OpenSSL include/network/OpenSSL/OpenSSLConnection.cpp)
add_library(WebSocket include/network/WebSocket/WebSocketConnection.cpp)

add_executable(ros_bridge_node src/main.cpp)

## Lib links
target_link_libraries(ros_client ConfigCommon ${catkin_LIBRARIES} ${RapidJSON_LIBRARIES} OpenSSL WebSocket)
target_link_libraries(ConfigCommon ${catkin_LIBRARIES} ${RapidJSON_LIBRARIES} OpenSSL WebSocket)

target_link_libraries(ros_bridge_node ${catkin_LIBRARIES} ros_client ConfigCommon OpenSSL WebSocket ${RapidJSON_LIBRARIES})

Так что, когда компилятор пытается связать мой основной файл (который ros_bridge_node), я получаю ошибку со связью:

ros_client.cpp:(.text+0x605): undefined reference to `awsiotsdk::util::Logging::GetLogSystem()'
ros_client.cpp:(.text+0x66d): undefined reference to `awsiotsdk::ResponseHelper::ToString[abi:cxx11](awsiotsdk::ResponseCode)'
CMakeFiles/ros_bridge_node.dir/src/ros_client.cpp.o: In function `ros_bridge::RosClient::RunPublish(int&)':
ros_client.cpp:(.text+0x8d9): undefined reference to `awsiotsdk::Utf8String::Create(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `BIO_push'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `awsiotsdk::NetworkConnection::Read(std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned long, unsigned long, unsigned long&)'
/home/abyl/master-wheel/devel/lib/libConfigCommon.so: undefined reference to `awsiotsdk::util::JsonParser::InitializeFromJsonFile(rapidjson::GenericDocument<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>, rapidjson::CrtAllocator>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `SHA1'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `BIO_f_base64'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `awsiotsdk::network::OpenSSLConnection::IsPhysicalLayerConnected()'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `BIO_set_flags'
/home/abyl/master-wheel/devel/lib/libWebSocket.so: undefined reference to `BIO_new'

Так как я могу правильно связать библиотеки с моим главным файлом?

РЕДАКТИРОВАТЬ:

У меня есть set объектные файлы aws_iot_sdk, как это:

set(${aws_sdk} /home/ren/aws-iot-device-sdk-cpp/build/CMakeFiles/aws-iot-sdk-cpp.dir/src)


set_source_files_properties(
  ${aws_sdk_path}
  PROPERTIES
  EXTERNAL_OBJECT true
  GENERATED true
)

И пытался связать это с моим основным файлом:

target_link_libraries(ros_bridge_node ros_client ConfigCommon Open WebSocket wslay ${RapidJSON_LIBRARIES} ${catkin_LIBRARIES} -lssl ${aws_sdk})

Но все равно получал ту же проблему со связью. Может быть, я неправильно связываю объектные файлы? (Теперь все проблемы со связью из aws_iot_sdk)

...