CMake Linker не может создать исполняемый файл со статическими функциями - PullRequest
0 голосов
/ 13 марта 2019

Я постараюсь описать эту проблему как можно лучше.Я пытаюсь catkin_make создать мультипакетный проект c ++, но у меня возникают проблемы с компоновщиком при попытке создать исполняемые файлы для 2 пакетов.

Ошибка:

forge/devel/lib/libforge_features.so: undefined reference to `ErrorClientKeeper::addError(ForgeError::Severity, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
collect2: error: ld returned 1 exit status
forge_feature_identification/CMakeFiles/feature_identification_service_node.dir/build.make:224: recipe for target '/home/brian-pc/forge/devel/lib/forge_feature_identification/feature_identification_service_node' failed
make[2]: *** [/home/brian-pc/forge/devel/lib/forge_feature_identification/feature_identification_service_node] Error 1
CMakeFiles/Makefile2:8322: recipe for target 'forge_feature_identification/CMakeFiles/feature_identification_service_node.dir/all' failed
make[1]: *** [forge_feature_identification/CMakeFiles/feature_identification_service_node.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
CMakeFiles/part_manager_node.dir/src/part.cpp.o: In function `Part::read(int)':
part.cpp:(.text+0x88f): undefined reference to `ErrorClientKeeper::addError(ForgeError::Severity, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
part.cpp:(.text+0x102b): undefined reference to `ErrorClientKeeper::addError(ForgeError::Severity, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
CMakeFiles/part_manager_node.dir/src/part.cpp.o: In function `Part::createFromTemplate(int)':
part.cpp:(.text+0x137d): undefined reference to `ErrorClientKeeper::addError(ForgeError::Severity, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
part.cpp:(.text+0x1a21): undefined reference to `ErrorClientKeeper::addError(ForgeError::Severity, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
collect2: error: ld returned 1 exit status
forge_part_manager/CMakeFiles/part_manager_node.dir/build.make:172: recipe for target '/home/brian-pc/forge/devel/lib/forge_part_manager/part_manager_node' failed
make[2]: *** [/home/brian-pc/forge/devel/lib/forge_part_manager/part_manager_node] Error 1
CMakeFiles/Makefile2:9105: recipe for target 'forge_part_manager/CMakeFiles/part_manager_node.dir/all' failed
make[1]: *** [forge_part_manager/CMakeFiles/part_manager_node.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

feature_identification_service_node и part_manager_node - это exes, которые он пытается построить.Функция, на которую она пытается сослаться, является статической функцией и представляет собой пакет с именем forge_errors, объявленный в файле error_client_keeper.h.Вот заголовочный файл для этого:

#ifndef __ERROR_CLIENT_KEEPER_H_INCLUDED__
#define __ERROR_CLIENT_KEEPER_H_INCLUDED__

#include <ros/ros.h>

#include <forge_errors/Error.h>
#include <forge_errors/forge_error.h>
#include <forge_errors/alert_service.h>
#include <forge_errors/error_client.h>

class ErrorClientKeeper
{
public:

  static bool addError(ForgeError err);
  static bool addError(ForgeError::Severity severity, std::string msg, std::string caller = "", bool display = true);

private:
  ErrorClientKeeper();
  ~ErrorClientKeeper(){};

};

#endif

.cpp файл:

#include <forge_errors/error_client_keeper.h>

bool addError(ForgeError err)
{
  ros::NodeHandle nh;

  ErrorClient client(nh);

  bool success = client.addError(err);

  ros::spinOnce();

  return success;
}
bool addError(ForgeError::Severity severity, std::string msg, std::string caller = "", bool display = true)
{
  ros::NodeHandle nh;

  ErrorClient client(nh);

  bool success = client.addError(severity, msg, caller, display);

  ros::spinOnce();

  return success;
}

Ошибка forge - это также класс в пакете forge_errors, в forge_error.h

Вот файл cmakelists.txt пакета feature_identification

cmake_minimum_required(VERSION 2.8.3)
project(forge_feature_identification)

find_package(catkin REQUIRED COMPONENTS
  forge_msgs
  forge_features
  roscpp
  rospy
  actionlib
  actionlib_msgs
)

###################################
## catkin specific configuration ##
###################################

catkin_package(
 CATKIN_DEPENDS
  forge_msgs
  forge_features
  roscpp
  rospy
  actionlib
  actionlib_msgs
)

###########
## Build ##
###########

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_executable(
  feature_identification_service_node
  src/feature_identification_service_node.cpp
  src/feature_identification_service.cpp
  src/feature_identifier.cpp
  src/seam_identifier.cpp
  src/part_model_identifier.cpp
)
target_link_libraries(
  feature_identification_service_node
  ${catkin_LIBRARIES}
)
 add_dependencies(
  feature_identification_service_node
  ${catkin_EXPORTED_TARGETS}
)

#############
## Install ##
#############

# Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

Вот файл cmakelist.txt part_manager_node

project(forge_part_manager)

## Find catkin macros and libraries
find_package(catkin REQUIRED COMPONENTS
  forge_db_manager
  forge_utils
  forge_msgs
  forge_features
  forge_feature_identification
  actionlib
  roscpp
  forge_errors
  rospy
  std_msgs
)

###################################
## catkin specific configuration ##
###################################
catkin_package(
 # INCLUDE_DIRS include
 # LIBRARIES forge_part_manager
 CATKIN_DEPENDS
  forge_db_manager
  forge_utils
  forge_features
  forge_feature_identification
  roscpp
  rospy
  std_msgs
  forge_errors
  actionlib
#  DEPENDS system_lib
)

###########
## Build ##
###########
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_executable(
  part_manager_node
  src/part_manager_node.cpp
  src/part_manager.cpp
  src/part.cpp
)
target_link_libraries(
  part_manager_node
  ${catkin_LIBRARIES}
)

#############
## Install ##
#############

Есть и другие релевантные файлы, которые я могу показать, но это уже довольно долго.Пакет forge_features зависит от forge_errors, и все файлы в нем

#include <forge_errors/error_client_keeper.h>
#include <forge_errors/forge_error.h>

в заголовочных файлах.А в списках cmakelists forge_features они перечислены в папках find_package и catkin_package (CATKIN_DEPENDS, а также в package.xml для зависимостей build и exec

part.h также включает эти два файла.

вот соответствующий раздел cmakelists пакета ошибок:

catkin_package(
 INCLUDE_DIRS
  include
 LIBRARIES
  forge_errors
 CATKIN_DEPENDS
  forge_msgs
  forge_db_manager
  forge_utils
  roscpp
)

###########
## Build ##
###########

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_library(
  forge_errors
  src/forge_error.cpp
  src/error_service.cpp
  src/error_service_node.cpp
  src/error_client.cpp
  src/alert_service.cpp
  src/error_client_keeper.cpp
)
target_link_libraries(
  forge_errors
  ${catkin_LIBRARIES}
)
add_dependencies(
  forge_errors
  ${PROJECT_NAME}_generate_messages_cpp
  ${catkin_EXPORTED_TARGETS}
)

add_executable(
  error_service_node
  src/error_service_node.cpp
  src/error_service.cpp
  src/forge_error.cpp
  src/alert_service.cpp
)
target_link_libraries(
  error_service_node
  ${catkin_LIBRARIES}
)
add_dependencies(
  error_service_node
  ${PROJECT_NAME}_generate_messages_cpp
  ${catkin_EXPORTED_TARGETS}
) 

#############
## Install ##
#############

# Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

Я могу предоставить любые другие файлы, которые было бы полезно увидеть, но этот пост уже слишком длинный, так что, надеюсь, кто-то сможет пробраться через него изнает, в чем проблема, потому что я не знаю. forge_errors должна быть полной и правильно построенной библиотекой, и я не знаю, почему она не может связать ее с этими исполняемыми файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...