Я постараюсь описать эту проблему как можно лучше.Я пытаюсь 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 должна быть полной и правильно построенной библиотекой, и я не знаю, почему она не может связать ее с этими исполняемыми файлами.