Catkin/Ros "undefined reference to" - c++

I'm trying to build a project with ROS, but I keep getting "undefined reference to <>" errors, for exemple :
CMakeFiles/robot_controller_node.dir/src/Node_Robot_Controller.cpp.o: dans la fonction « main »:
Node_Robot_Controller.cpp:(.text+0x1f1): référence indéfinie vers « trajectoryclass::trajectoryclass(ros::NodeHandle) »
Node_Robot_Controller.cpp:(.text+0x796): référence indéfinie vers « List_Container::getElement(int) »
Node_Robot_Controller.cpp:(.text+0x7ab): référence indéfinie vers « Task_Interface::getTaskDescription() »
Node_Robot_Controller.cpp:(.text+0x7d1): référence indéfinie vers « List_Container::getElement(int) »
Node_Robot_Controller.cpp:(.text+0x7d9): référence indéfinie vers « Task_Interface::getTaskId() »
Node_Robot_Controller.cpp:(.text+0x83a): référence indéfinie vers « List_Container::getElement(int) »
Node_Robot_Controller.cpp:(.text+0x977): référence indéfinie vers « List_Container::next() »
Node_Robot_Controller.cpp:(.text+0xa60): référence indéfinie vers « List_Container::getElement(int) »
Node_Robot_Controller.cpp:(.text+0xa68): référence indéfinie vers « Task_Interface::getTaskId() »
Node_Robot_Controller.cpp:(.text+0xab5): référence indéfinie vers « List_Container::getElement(int) »
Node_Robot_Controller.cpp:(.text+0xadd): référence indéfinie vers « List_Container::isEmpty() »
/home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/librobot_controller_library.so: référence indéfinie vers « error_norm(std::vector >, std::vector >) »
/home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/librobot_controller_library.so: référence indéfinie vers « Position_Joint::getVector() »
collect2: error: ld returned 1 exit status
make[2]: *** [/home/tcozic/Documents/git_ur10/catkin_ws/devel/lib/ur10/robot_controller_node] Erreur 1
make[1]: *** [ur10/CMakeFiles/robot_controller_node.dir/all] Erreur 2
make: *** [all] Erreur 2
Invoking "make install -j4 -l4" failed
This is my CmakeLists.txt for the compilation of this package :
<pre><code>
cmake_minimum_required(VERSION 2.8.3)
project(ur10)
set(MSG_DEPS
std_msgs
sensor_msgs
geometry_msgs
trajectory_msgs
moveit_msgs
)
find_package(catkin REQUIRED COMPONENTS
message_generation
moveit_core
moveit_ros_planning
moveit_ros_planning_interface
dynamic_reconfigure
moveit_ros_move_group
pcl_conversions ##adding
pcl_msgs ##adding
roscpp
rospy
roslib
#tf
#urdf
genmsg
${MSG_DEPS}
)
find_package(VISP REQUIRED)
find_library(VISP_LIBRARIES NAMES visp HINTS ${VISP_LIBRARY_DIRS} )
find_package(PCL REQUIRED)
find_package(OpenCV REQUIRED)
find_package( ur_package REQUIRED)
## Generate messages in the 'msg' folder
add_message_files(
FILES
Task_move.msg
Task_wait.msg
Piece.msg
Task.msg
Task_tool.msg
)
# Generate services in the 'srv' folder
add_service_files(
FILES
Validation.srv
NewPiece.srv
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs # Or other packages containing msgs
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS message_runtime roscpp rospy roslib moveit_core moveit_ros_planning_interface #moveit_plan_execution
moveit_trajectory_execution_manager moveit_ros_planning moveit_planning_scene_monitor ${MSG_DEPS}
DEPENDS VISP OpenCV
)
###########
## Build ##
###########
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "-std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "-std=c++0x")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler. Suggested solution: update the pkg build-essential ")
endif()
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(include ${catkin_INCLUDE_DIRS})
include_directories(${ur_package_INCLUDE_DIRS})
## Declare a C++ library
add_library(robot_controller_library
src/List_Container/List_Container.cpp
src/Piece_Description/Piece.cpp
src/Robot_Description/Robot.cpp
src/Robot_Description/Tool.cpp
src/Robot_Description/Tool_IO_Config.cpp
src/Position/Position_Interface.cpp
src/Position/Position_Joint.cpp
src/Position/Position_TCP.cpp
src/Task/Task_Move.cpp
src/Task/Task_Tool.cpp
src/Task/Task_Wait.cpp
)
add_dependencies(robot_controller_library ur10_gencpp)
# Declare a C++ executable
add_executable(robot_controller_node src/Node_Robot_Controller.cpp)
#add_dependencies(robot_controller ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(robot_controller_node robot_controller_library ${catkin_LIBRARIES} ${VISP_LIBRARIES})
</code></pre>
All *.cpp files are classes, with theirs own headers in the include/ur10/ [Directory_name]/directories, except for the Node_controller_node.cpp
This is my first big project with ROS and I don't understand where the problem come from....
Thanks in advance for your help !
Edit : I tried to compile the library without the node:
## Declare a C++ library
set(SOURCE_robot_controller_library
src/List_Container/List_Container.cpp
src/Piece_Description/Piece.cpp
src/Robot_Description/Robot.cpp
src/Robot_Description/Tool.cpp
src/Robot_Description/Tool_IO_Config.cpp
src/Position/Position_Interface.cpp
src/Position/Position_Joint.cpp
src/Position/Position_TCP.cpp
src/Task/Task_Move.cpp
src/Task/Task_Tool.cpp
src/Task/Task_Wait.cpp
src/Task/Task_Interface.cpp
)
add_library(Robot_controller_lib ${SOURCE_robot_controller_library})
add_dependencies(Robot_controller_lib ur10_gencpp)
target_link_libraries(Robot_controller_lib
${catkin_LIBRARIES}
${VISP_LIBRARIES})
I don't have any errrors, but I keep getting the reference error when I try to add the compilation of the node :
add_executable(robot_controller_node src/Node_Robot_Controller.cpp)
add_dependencies(robot_controller_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(robot_controller_node
Robot_controller_lib
${catkin_LIBRARIES}
${VISP_LIBRARIES})
PS: I can't post code here, it is for a professionnal project.
Could it be a probleme with the use of inheritance or virtual functions with catkin ? The classes List_Container and Task_Interface possess virtual functions and inherit others class. I already make sure that all functions have been implemented.

Related

Install driver to OpenNI2 on Ubuntu (WebCam4OpenNI2)

For a project where I was asked to manage videos from RGB and RGBD cameras simultaneously, I'm trying to install the driver WebCam4OpenNI2 https://github.com/KHeresy/WebCam4OpenNI2 for OpenNI2. I'm on Ubuntu 20.04 LTS and my version of OpenNI2 is 2.2.0
The driver seem to have only been tested for Windows, but is supposed to be able to work with other platforms. Still, I'm not sure what changes I'm supposed to do to OpenNI2 to use it.
Currently, I tried to update OpenNI2 Makefile:
#############################################################################
# OpenNI makefile.
#
# default configuration is Release. for a debug version use:
# make CFG=Debug
#
# default compiler is g++. for another one use:
# make CXX=<comp>
#
# By default, CLR projects will only be build if mono is installed.
# To force CLR projects use:
# make FORCE_BUILD_CLR=1
#
#############################################################################
export ALLOW_WARNINGS = 1
include ThirdParty/PSCommon/BuildSystem/CommonDefs.mak
MAJOR_VERSION = $(shell grep "define ONI_VERSION_MAJOR" Include/OniVersion.h | cut -f 2)
MINOR_VERSION = $(shell grep "define ONI_VERSION_MINOR" Include/OniVersion.h | cut -f 2)
MAINT_VERSION = $(shell grep "define ONI_VERSION_MAINT" Include/OniVersion.h | cut -f 2)
ifeq ("$(OSTYPE)","Darwin")
OS_NAME = MacOSX
else
OS_NAME = Linux
endif
PRODUCT_STRING = OpenNI-$(OS_NAME)-$(PLATFORM)-$(shell cd Packaging && python -c "import UpdateVersion; print UpdateVersion.getVersionName()" && cd ..)
FINAL_DIR = Packaging/Final
OPENNI = Source/Core
XNLIB = ThirdParty/PSCommon/XnLib/Source
DEPTH_UTILS = Source/DepthUtils
# list all drivers
ALL_DRIVERS = \
Source/Drivers/DummyDevice \
Source/Drivers/PS1080 \
Source/Drivers/PSLink \
Source/Drivers/OniFile \
Source/Drivers/WebCam4OpenNI2
# list all wrappers
ALL_WRAPPERS = \
Wrappers/java/OpenNI.jni \
Wrappers/java/OpenNI.java
# list all tools
ALL_TOOLS = \
Source/Drivers/PS1080/PS1080Console \
Source/Drivers/PSLink/PSLinkConsole
# list all core projects
ALL_CORE_PROJS = \
$(XNLIB) \
$(OPENNI) \
$(DEPTH_UTILS) \
$(ALL_DRIVERS) \
$(ALL_WRAPPERS) \
$(ALL_TOOLS)
# list all samples
CORE_SAMPLES = \
Samples/SimpleRead \
Samples/EventBasedRead \
Samples/MultipleStreamRead \
Samples/MWClosestPoint \
Samples/MWClosestPointApp
# list all java samples
JAVA_SAMPLES = \
Samples/SimpleViewer.java
ifeq "$(GLUT_SUPPORTED)" "1"
ALL_TOOLS += \
Source/Tools/NiViewer
CORE_SAMPLES += \
Samples/SimpleViewer \
Samples/MultiDepthViewer \
Samples/ClosestPointViewer
else
ifeq "$(GLES_SUPPORTED)" "1"
CORE_SAMPLES +=
endif
endif
ALL_SAMPLES = \
$(CORE_SAMPLES) \
$(JAVA_SAMPLES)
# list all projects that are build
ALL_BUILD_PROJS = \
$(ALL_CORE_PROJS) \
$(ALL_SAMPLES)
ALL_PROJS = \
$(ALL_BUILD_PROJS)
ALL_PROJS_CLEAN = $(foreach proj,$(ALL_PROJS),$(proj)-clean)
# define a function which creates a target for each proj
define CREATE_PROJ_TARGET
$1:
$$(MAKE) -C $1
$1-clean:
$$(MAKE) -C $1 clean
endef
################ TARGETS ##################
.PHONY: all $(ALL_PROJS) $(ALL_PROJS_CLEAN) install uninstall clean release
# make all makefiles
all: $(ALL_PROJS)
core: $(ALL_CORE_PROJS)
samples: $(ALL_SAMPLES)
# create projects targets
$(foreach proj,$(ALL_PROJS),$(eval $(call CREATE_PROJ_TARGET,$(proj))))
# additional dependencies
$(OPENNI): $(XNLIB)
Wrappers/java/OpenNI.jni: $(OPENNI) $(XNLIB)
Source/Drivers/DummyDevice: $(OPENNI) $(XNLIB)
Source/Drivers/RawDevice: $(OPENNI) $(XNLIB)
Source/Drivers/PS1080: $(OPENNI) $(XNLIB) $(DEPTH_UTILS)
Source/Drivers/PS1080/PS1080Console: $(OPENNI) $(XNLIB)
Source/Drivers/PSLink: $(OPENNI) $(XNLIB)
Source/Drivers/PSLink/PSLinkConsole: $(OPENNI) $(XNLIB)
Source/Drivers/OniFile: $(OPENNI) $(XNLIB)
Source/Drivers/WebCam4OpenNI2: $(OPENNI) $(XNLIB) -lopencv_core -lopencv_highgui -lopencv_imgproc
Source/Tools/NiViewer: $(OPENNI) $(XNLIB)
Samples/SimpleRead: $(OPENNI)
Samples/EventBasedRead: $(OPENNI)
Samples/MultipleStreamRead: $(OPENNI)
Samples/MWClosestPoint: $(OPENNI)
Samples/MWClosestPointApp: $(OPENNI) Samples/MWClosestPoint
Samples/SimpleViewer: $(OPENNI)
Samples/MultiDepthViewer: $(OPENNI)
Samples/ClosestPointViewer: $(OPENNI) Samples/MWClosestPoint
Samples/SimpleViewer.java: Wrappers/java/OpenNI.java
$(FINAL_DIR):
mkdir -p $(FINAL_DIR)
doc:
Source/Documentation/Runme.py
rm -f Source/Documentation/html/*.md5
release: | all doc $(FINAL_DIR)
Packaging/Harvest.py Packaging/$(PRODUCT_STRING) $(PLATFORM)
cd Packaging; tar -cjf Final/$(PRODUCT_STRING).tar.bz2 $(PRODUCT_STRING)
# clean is cleaning all projects
clean: $(ALL_PROJS_CLEAN)
The only lines different are the 2 about WebCam4OpenNI2.
And used the model included in OpenNI2 (DummyDevice) to include it in a folder at Source/Drivers/WebCam4OpenNI2 containing the .cpp, .ini and .vcxproj coming from the Github page of WebCam4OpenNI2. The Makefile looks like it:
include ../../../ThirdParty/PSCommon/BuildSystem/CommonDefs.mak
BIN_DIR = ../../../Bin
INC_DIRS = \
../../../Include \
../../../ThirdParty/PSCommon/XnLib/Include
INC_DIRS += /usr/include/opencv4
LIB_DIRS += /usr/include/opencv4
SRC_FILES = \
*.cpp
ifeq ("$(OSTYPE)","Darwin")
INC_DIRS += /opt/local/include
LIB_DIRS += /opt/local/lib
LDFLAGS += -framework CoreFoundation -framework IOKit
endif
LIB_NAME = WebCam4OpenNI2
LIB_DIRS = ../../../ThirdParty/PSCommon/XnLib/Bin/$(PLATFORM)-$(CFG)
USED_LIBS = XnLib dl pthread
ifneq ("$(OSTYPE)","Darwin")
USED_LIBS += rt
endif
CFLAGS += -Wall
OUT_DIR := $(OUT_DIR)/OpenNI2/Drivers
include ../../../ThirdParty/PSCommon/BuildSystem/CommonCppMakefile
The lines different from the DummyDevice Makefile are:
INC_DIRS += /usr/include/opencv4
LIB_DIRS += /usr/include/opencv4
LIB_NAME = WebCam4OpenNI2
When building, the linking of the driver to OpenCV doesn't seem to work and I get the following error:
...
g++ -o ../../../Bin/x64-Release/OpenNI2/Drivers/libWebCam4OpenNI2.so ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o -L../../../ThirdParty/PSCommon/XnLib/Bin/x64-Release -L../../../Bin/x64-Release/OpenNI2/Drivers -lXnLib -ldl -lpthread -lrt -Wl,--no-undefined -shared
g++ -MD -MP -MT "./../../../Bin/Intermediate/x64-Release/libOniFile.so/jidctint.d ../../../Bin/Intermediate/x64-Release/libOniFile.so/jidctint.o" -c -msse3 -Wall -O2 -DNDEBUG -I. -I../../../Include -I../../../ThirdParty/PSCommon/XnLib/Include -I../../../ThirdParty/LibJPEG -IFormats -fPIC -fvisibility=hidden -o ../../../Bin/Intermediate/x64-Release/libOniFile.so/jidctint.o ../../../ThirdParty/LibJPEG/jidctint.c
g++ -MD -MP -MT "./../../../Bin/Intermediate/x64-Release/libPS1080.so/XnUncompressedDepthProcessor.d ../../../Bin/Intermediate/x64-Release/libPS1080.so/XnUncompressedDepthProcessor.o" -c -msse3 -Wall -O2 -DNDEBUG -I. -IInclude -I../../../Include -I../../../ThirdParty/PSCommon/XnLib/Include -I../../../ThirdParty/LibJPEG -I../../DepthUtils -fPIC -fvisibility=hidden -o ../../../Bin/Intermediate/x64-Release/libPS1080.so/XnUncompressedDepthProcessor.o Sensor/XnUncompressedDepthProcessor.cpp
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « oniDriverDeviceDestroyStream » :
OpenCVCamera.cpp:(.text+0x12f5) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « oniDriverStreamStart » :
OpenCVCamera.cpp:(.text+0x136a) : référence indéfinie vers « cv::VideoCapture::isOpened() const »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « oniDriverDeviceCreateStream » :
OpenCVCamera.cpp:(.text+0x14e3) : référence indéfinie vers « cv::VideoCapture::VideoCapture() »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1513) : référence indéfinie vers « cv::VideoCapture::open(int, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1520) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1539) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1552) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « oniDriverDeviceOpen » :
OpenCVCamera.cpp:(.text+0x175b) : référence indéfinie vers « cv::VideoCapture::VideoCapture(int, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x176d) : référence indéfinie vers « cv::VideoCapture::isOpened() const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1794) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x17b3) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x17d2) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x183d) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1858) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1873) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x188c) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x18af) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x18d2) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x1934) : référence indéfinie vers « cv::VideoCapture::release() »
/usr/bin/ld : OpenCVCamera.cpp:(.text+0x19ac) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « cv::Mat::~Mat() » :
OpenCVCamera.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x6e) : référence indéfinie vers « cv::fastFree(void*) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x79) : référence indéfinie vers « cv::Mat::deallocate() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « oniDriverDeviceCreateStream.cold » :
OpenCVCamera.cpp:(.text.unlikely+0x2e4) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « oniDriverDeviceOpen.cold » :
OpenCVCamera.cpp:(.text.unlikely+0x30d) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Color_Stream::~OpenCV_Color_Stream() » :
OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_StreamD2Ev[_ZN19OpenCV_Color_StreamD5Ev]+0x4b) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Color_Stream::~OpenCV_Color_Stream() » :
OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_StreamD0Ev[_ZN19OpenCV_Color_StreamD5Ev]+0x4a) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Camera_Device::destroyStream(oni::driver::StreamBase*) » :
OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device13destroyStreamEPN3oni6driver10StreamBaseE[_ZN20OpenCV_Camera_Device13destroyStreamEPN3oni6driver10StreamBaseE]+0x62) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Color_Stream::start() » :
OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream5startEv[_ZN19OpenCV_Color_Stream5startEv]+0x22) : référence indéfinie vers « cv::VideoCapture::isOpened() const »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Color_Stream::UpdateData() » :
OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x160) : référence indéfinie vers « cv::VideoCapture::operator>>(cv::Mat&) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x1b0) : référence indéfinie vers « cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x292) : référence indéfinie vers « cv::fastFree(void*) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x311) : référence indéfinie vers « cv::fastFree(void*) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x378) : référence indéfinie vers « cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x40c) : référence indéfinie vers « cv::Mat::deallocate() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream10UpdateDataEv[_ZN19OpenCV_Color_Stream10UpdateDataEv]+0x41c) : référence indéfinie vers « cv::Mat::deallocate() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Color_Stream::setProperty(int, void const*, int) » :
OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream11setPropertyEiPKvi[_ZN19OpenCV_Color_Stream11setPropertyEiPKvi]+0x57) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream11setPropertyEiPKvi[_ZN19OpenCV_Color_Stream11setPropertyEiPKvi]+0x75) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream11setPropertyEiPKvi[_ZN19OpenCV_Color_Stream11setPropertyEiPKvi]+0x93) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream11setPropertyEiPKvi[_ZN19OpenCV_Color_Stream11setPropertyEiPKvi]+0xa8) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream11setPropertyEiPKvi[_ZN19OpenCV_Color_Stream11setPropertyEiPKvi]+0xbf) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN19OpenCV_Color_Stream11setPropertyEiPKvi[_ZN19OpenCV_Color_Stream11setPropertyEiPKvi]+0xd6) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Camera_Device::createStream(OniSensorType) » :
OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device12createStreamE13OniSensorType[_ZN20OpenCV_Camera_Device12createStreamE13OniSensorType]+0x7b) : référence indéfinie vers « cv::VideoCapture::VideoCapture() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device12createStreamE13OniSensorType[_ZN20OpenCV_Camera_Device12createStreamE13OniSensorType]+0xab) : référence indéfinie vers « cv::VideoCapture::open(int, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device12createStreamE13OniSensorType[_ZN20OpenCV_Camera_Device12createStreamE13OniSensorType]+0xb8) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device12createStreamE13OniSensorType[_ZN20OpenCV_Camera_Device12createStreamE13OniSensorType]+0xd1) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device12createStreamE13OniSensorType[_ZN20OpenCV_Camera_Device12createStreamE13OniSensorType]+0xea) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Device12createStreamE13OniSensorType[_ZN20OpenCV_Camera_Device12createStreamE13OniSensorType]+0x14b) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Camera_Driver::deviceOpen(char const*, char const*) » :
OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x15a) : référence indéfinie vers « cv::VideoCapture::VideoCapture(int, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x16c) : référence indéfinie vers « cv::VideoCapture::isOpened() const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x193) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x1b2) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x1d1) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x234) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x24f) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x26a) : référence indéfinie vers « cv::VideoCapture::set(int, double) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x283) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x2a6) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x2c9) : référence indéfinie vers « cv::VideoCapture::get(int) const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x327) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x384) : référence indéfinie vers « cv::VideoCapture::release() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_[_ZN20OpenCV_Camera_Driver10deviceOpenEPKcS1_]+0x460) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : ./../../../Bin/Intermediate/x64-Release/libWebCam4OpenNI2.so/OpenCVCamera.o : dans la fonction « OpenCV_Camera_Driver::initialize(void (*)(OniDeviceInfo const*, void*), void (*)(OniDeviceInfo const*, void*), void (*)(OniDeviceInfo const*, int, void*), void*) » :
OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_[_ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_]+0x79) : référence indéfinie vers « cv::VideoCapture::VideoCapture(int, int) »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_[_ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_]+0x81) : référence indéfinie vers « cv::VideoCapture::isOpened() const »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_[_ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_]+0x91) : référence indéfinie vers « cv::VideoCapture::release() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_[_ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_]+0x641) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_[_ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_]+0x6d1) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
/usr/bin/ld : OpenCVCamera.cpp:(.text._ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_[_ZN20OpenCV_Camera_Driver10initializeEPFvPK13OniDeviceInfoPvES5_PFvS2_iS3_ES3_]+0x781) : référence indéfinie vers « cv::VideoCapture::~VideoCapture() »
collect2: error: ld returned 1 exit status
make[1]: *** [../../../ThirdParty/PSCommon/BuildSystem/CommonCppMakefile:136 : ../../../Bin/x64-Release/OpenNI2/Drivers/libWebCam4OpenNI2.so] Erreur 1
...
If someone can tell me what I'm doing wrong, it would be very helpful.
Thanks

Cmake Error undefined reference when linking cxx executable

In my C++ Cmake project, i recently had to include mariadb c++ connector. (i'm a cmake beginner).
Idea is to create and install my own libraries (eg: libnt) depending on this mariadb connector and use them into another program.
So i've made a main.cpp at the root in order to test it.
The project structure is as follow :
--Libnt (root)
|
--- build
|
--- nt
| |
| --- include
| | |
| | --- nt
| | |---log.h
| | |---dcs.h
| | |---db.h
| |
| --- src
| | |---log.cpp
| | |---dcs.cpp
| | |---db.cpp
| |
| --- thirdparty
| | |-- restc-cpp
| |
| --- CMakeLists.txt
|
|--- CmakeLists.txt
|--- main.cpp
I did the mariadb installation as per the documentation
When cmake.. && make , i do have the following error and i don't really know how to deal with it.
[100%] Linking CXX executable trylib
/usr/bin/ld : avertissement : libmariadb.so.3, requis par /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so, non trouvé (essayez avec -rpath ou -rpath-link)
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_field_direct#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_num_rows#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_reset_connection#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_lengths#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_close#libmysqlclient_18 »
Can someone please help me on this ?
Regards,
CMakeLists.txt (root)
cmake_minimum_required(VERSION 3.0.0)
project(Calculator_Project VERSION 1.0.0)
set (CMAKE_CXX_STANDARD 14)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
add_subdirectory(my_math)
add_subdirectory(my_print)
add_subdirectory(nt)
add_executable(trylib main.cpp)
target_link_libraries(trylib PRIVATE my_math my_print nt)
message("CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
CMakeLists.txt
set (CMAKE_CXX_STANDARD 14)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
message(${CMAKE_CURRENT_LIST_DIR}/thirdparty/restc-cpp/include)
include_directories(${CMAKE_CURRENT_LIST_DIR}/thirdparty/restc-cpp/include)
set(Boost_USE_STATIC_LIBS ON) # only find static libs
set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and
set(Boost_USE_RELEASE_LIBS ON) # only find release libs
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.71.0 COMPONENTS system iostreams asio program_options filesystem date_time context coroutine coroutines chrono log)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
endif()
find_package(Threads REQUIRED)
find_library(restc-cpp_location NAMES libnamespacetest.a librestc-cpp.a)
message(STATUS ${restc-cpp_location0})
add_library(restc-cpp STATIC IMPORTED)
set_target_properties(restc-cpp PROPERTIES IMPORTED_LOCATION ${restc-cpp_location})
#[[
LIBNT
]]#
add_library(nt src/log.cpp src/dcs.cpp src/db.cpp)
target_link_libraries(nt PRIVATE Threads::Threads restc-cpp mariadbcpp ssl crypto z boost_iostreams boost_log ${Boost_LIBRARIES})
target_include_directories( nt PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/nt/log.h
${CMAKE_CURRENT_SOURCE_DIR}/include/nt/dcs.h
${CMAKE_CURRENT_SOURCE_DIR}/include/nt/db.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/nt)
install(TARGETS nt EXPORT my_export DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/nt)
install(EXPORT my_export FILE nt-config.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/nt)
Here is the complete trace :
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found GTest: /usr/lib/x86_64-linux-gnu/libgtest.a
/home/pierre/Documents/Git/Libnt/nt/thirdparty/restc-cpp/include
-- Could NOT find Boost: missing: asio coroutines (found /usr/local/lib/cmake/Boost-1.77.0/BoostConfig.cmake (found suitable version "1.77.0", minimum required is "1.71.0"))
-- Found Threads: TRUE
--
CMAKE_INSTALL_PREFIX = /usr/local
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pierre/Documents/Git/Libnt/build
[ 9%] Building CXX object nt/CMakeFiles/nt.dir/src/log.cpp.o
[ 18%] Building CXX object nt/CMakeFiles/nt.dir/src/dcs.cpp.o
[ 27%] Building CXX object nt/CMakeFiles/nt.dir/src/db.cpp.o
[ 36%] Linking CXX static library libnt.a
[ 36%] Built target nt
[ 45%] Building CXX object my_print/CMakeFiles/my_print.dir/src/print_result.cpp.o
[ 54%] Linking CXX static library libmy_print.a
[ 54%] Built target my_print
[ 63%] Building CXX object my_math/CMakeFiles/my_math.dir/src/addition.cpp.o
[ 72%] Building CXX object my_math/CMakeFiles/my_math.dir/src/division.cpp.o
[ 81%] Linking CXX static library libmy_math.a
[ 81%] Built target my_math
[ 90%] Building CXX object CMakeFiles/trylib.dir/main.cpp.o
/home/pierre/Documents/Git/Libnt/main.cpp:10:6: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type]
10 | main(){
| ^
[100%] Linking CXX executable trylib
/usr/bin/ld : avertissement : libmariadb.so.3, requis par /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so, non trouvé (essayez avec -rpath ou -rpath-link)
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_field_direct#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_num_rows#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_reset_connection#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_lengths#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_close#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_field_count#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_error#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_send_long_data#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_store_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_select_db#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_error#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_next_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mariadb_get_infov#libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_sqlstate#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_real_connect#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_get_server_info#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_insert_id#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_row#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_init#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_next_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_fetch_field#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_data_seek#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_thread_id#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mariadb_get_charset_by_nr#libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_execute#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_session_track_get_first#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_init#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_warning_count#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_param_count#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_insert_id#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_ping#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_errno#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_data_seek#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_optionsv#libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_close#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_get_socket#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_use_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_free_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_field_count#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_store_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_errno#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_bind_result#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_warning_count#libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_bind_param#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_sqlstate#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_attr_set#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_real_query#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_prepare#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mariadb_reconnect#libmariadb_3 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_affected_rows#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_result_metadata#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_fetch#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_num_rows#libmysqlclient_18 »
/usr/bin/ld : /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libmariadbcpp.so : référence indéfinie vers « mysql_stmt_affected_rows#libmysqlclient_18 »
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/trylib.dir/build.make:113 : trylib] Erreur 1
make[1]: *** [CMakeFiles/Makefile2:138 : CMakeFiles/trylib.dir/all] Erreur 2
make: *** [Makefile:136 : all] Erreur 2
Thank you nayab and Tsyvarev. Everything is now working !
Sorry for my lack of experience.
After a ldd libmariadbcpp.so, i had
linux-vdso.so.1 (0x00007ffe609ca000)
libmariadb.so.3 => not found
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f866ec91000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f866ec76000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f866ea84000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f866e935000)
/lib64/ld-linux-x86-64.so.2 (0x00007f866f02e000)
I had to do an sudo apt install libmariadb-dev, ldd command became
~/Documents/Git/Libnt/nt/thirdparty/mariadb-connector-cpp-1.0.1-ubuntu-focal-amd64/lib64/mariadb$ ldd libmariadbcpp.so
linux-vdso.so.1 (0x00007ffda61d1000)
libmariadb.so.3 => /lib/x86_64-linux-gnu/libmariadb.so.3 (0x00007f326f47d000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f326f29b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f326f280000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f326f08e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f326f088000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f326f065000)
libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f326ee8d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f326ee71000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f326ed22000)
/lib64/ld-linux-x86-64.so.2 (0x00007f326f68f000)
libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f326ebec000)
libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f326ebcb000)
libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f326ea49000)
libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f326ea31000)
libnettle.so.7 => /lib/x86_64-linux-gnu/libnettle.so.7 (0x00007f326e9f7000)
libhogweed.so.5 => /lib/x86_64-linux-gnu/libhogweed.so.5 (0x00007f326e9c0000)
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f326e93c000)
libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7 (0x00007f326e930000)

CMake Linker failing building executable with static functions

I'll try to describe this issue the best I can. I'm trying to catkin_make a multi-package c++ project, but I'm getting a couple linker issues when its trying to build executables for 2 of the packages.
The error:
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 and part_manager_node are the exes its trying to build.
The function its trying to reference is a static function is a package called forge_errors declared in file error_client_keeper.h. Here is the header file for that:
#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
The .cpp file:
#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 error is a class also in the forge_errors package, in forge_error.h
Here's the feature_identification package's cmakelists.txt
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
)
Here's part_manager_node's cmakelist.txt
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 ##
#############
There's more relevant files I can show, but this is already getting pretty long. The forge_features package depends on forge_errors, and the files in it all
#include <forge_errors/error_client_keeper.h>
#include <forge_errors/forge_error.h>
in the header files. And in the cmakelists for forge_features they're listed under find_package and catkin_package( CATKIN_DEPENDS, as well as in the package.xml for build and exec dependencies
part.h also includes those two files.
here's the relevant section of the errors package 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
)
I can provide any other files it would help to see, but this post is too long already, so hopefully someone is able to wade through it and knows what the issue is, because I don't. forge_errors should be a complete and correctly building library, and I don't know why it can't link it to these executables.

Linking CXX executable ERROR [Netbeans C++]

I'm trying to create a C++ project with an existing CMakeLists.txt file, but I have an error "Running make failed" in Netbeans C++ IDE. Here is the Build Output :
cd '/home/hamani/NetBeansProjects/BNproject'
/usr/bin/make -f Makefile
Scanning dependencies of target bnproject
[ 33%] Building CXX object CMakeFiles/bnproject.dir/main.cpp.o
[ 66%] Building CXX object CMakeFiles/bnproject.dir/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp.o
[100%] Linking CXX executable bnproject
CMakeFiles/bnproject.dir/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp.o: dans la fonction « main »:
/home/hamani/NetBeansProjects/BNproject/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp:514:
définitions multiples de « main »
CMakeFiles/bnproject.dir/main.cpp.o:/home/hamani/NetBeansProjects/BNproject/main.cpp:4: défini pour la première fois ici
CMakeFiles/bnproject.dir/main.cpp.o: dans la fonction « gum::HashTable, std::allocator >, int, std::allocator, std::allocator >, int> > > ::HashTable(unsigned long, bool, bool) »: /home/hamani/usr/include/agrum/core/hashTable.tcc:1573: référence indéfinie vers « gum::debug::__inc_creation(char const*, char const*, long, char const*, void const*, int) »
CMakeFiles/bnproject.dir/main.cpp.o: dans la fonction « gum::HashTable, std::allocator >, int, std::allocator, std::allocator >, int> > >::~HashTable() »:
/home/hamani/usr/include/agrum/core/hashTable.tcc:1675: référence indéfinie vers « gum::debug::__inc_deletion(char const*, char const*, long, char const*, void const*)
collect2: error: ld returned 1 exit status
CMakeFiles/bnproject.dir/build.make:120 : la recette pour la cible « bnproject » a échouée
make[2]: *** [bnproject] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/bnproject.dir/all » a échouée
make[1]: ***[CMakeFiles/bnproject.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2
BUILD FAILED (exit value 2, total time: 8s)
I'm using a library called aGrUM (https://forge.lip6.fr/projects/aGrUM/wiki) on Ubuntu 16.04, I installed it under the path
~/usr
I installed aGrUM in RELEASE mode, not in DEBUG mode
python act install release -d ~/usr
In Pre-Build Action, Netbeans suggests me these arguments :
-G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=${IDE_CC} -DCMAKE_CXX_COMPILER=${IDE_CXX} -DCMAKE_C_FLAGS_DEBUG="-g3 -gdwarf-2" -DCMAKE_CXX_FLAGS_DEBUG="-g3 -gdwarf-2" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
so I think I have to change the value of -DCMAKE_BUILD_TYPE to "RELEASE", to be compatible with my CMakeLists.txt.
Here is my CMakeLists.txt :
project(BNPROJECT)
cmake_minimum_required(VERSION 2.8)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
# do not forget to change this line if needed ("act install -d...")
#set(AGRUM_INSTALLATION_DIRECTORY "installation_path")
set(AGRUM_INSTALLATION_DIRECTORY "~/usr")
set(aGrUM_DIR "${AGRUM_INSTALLATION_DIRECTORY}/lib/cmake/aGrUM/")
find_package(aGrUM)
if (aGrUM_FOUND)
include_directories(${AGRUM_INCLUDE_DIR})
link_directories(${AGRUM_LIB_DIR})
else (aGrUM_FOUND)
message(FATAL_ERROR "Please install aGrUM")
endif (aGrUM_FOUND)
# cmake -DCMAKE_BUILD_TYPE=DEBUG
# or
# cmake -DCMAKE_BUILD_TYPE=RELEASE
# RELEASE is the default option (thanks to the next 3 lines)
if( NOT CMAKE_BUILD_TYPE )
set( CMAKE_BUILD_TYPE Release)
endif()
file(GLOB_RECURSE BNPROJECT_SOURCE ${BNPROJECT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE BNPROJECT_INCLUDE ${BNPROJECT_SOURCE_DIR}/*.h)
add_executable (bnproject ${BNPROJECT_SOURCE})
if ($CMAKE_BUILD_TYPE STREQUAL "RELEASE") # release : act install release
target_link_libraries(bnproject agrum)
else() # debug : act install debug
#target_link_libraries(bnproject agrum-dbg)
target_link_libraries(bnproject agrum)
endif()
and here is my main.cpp (example here : http://www-desir.lip6.fr/~phw/aGrUM/officiel/doxygen/db/db6/using_agrum.html) :
#include <iostream>
#include <agrum/core/hashTable.h>
int main(void) {
gum::HashTable<std::string,int> h;
h.insert("Hello",1);
h.insert("World",2);
std::cout<<h<<std::endl;
}

Using cmake to compile CSDP

I trying to use CSDP which is a mathematical library for SDP.
I download the library an extract the lib (libsdp.a). It is using lapack and blas lib, so I add -lblas and -llapack options.
I want to compile with cmake, hier is my CmakeList file (I comment a lot of line, I just want to test the compilation of example.c with is an example given by CSDP) :
# Cette commande non obligatoire est fortement conseillée.
cmake_minimum_required (VERSION 2.6)
# Déclaration du projet.
# Les fichiers CMakeLists pourront référer à la racine du projet par la variable
# ${ECMA_SOURCE_DIR} et ${ECMA_BINARY_DIR}
project(projet_ECMA)
set(EXE run)
# L'exécutable sera rangé différemment en fonction de la plateformee.
# Par défaut le binaire est construit dans le répertoire courant (?)
# set(EXECUTABLE_OUTPUT_PATH ../bin)
# set( EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE} )
# SET (CMAKE_C_COMPILER "/usr/bin/clang")
# SET (CMAKE_C_FLAGS "-Wall -std=c99")
# SET (CMAKE_C_FLAGS_DEBUG "-g++")
# SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
# SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
# SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
#
# SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
# SET (CMAKE_CXX_FLAGS "-Wall")
# SET (CMAKE_CXX_FLAGS_DEBUG "-g")
# SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
# SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
# SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
#
# SET (CMAKE_AR "/usr/bin/llvm-ar")
# SET (CMAKE_LINKER "/usr/bin/llvm-ld")
# SET (CMAKE_NM "/usr/bin/llvm-nm")
# SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
# SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
#set(CSDP_DIR "/home/hassan/Bureau/ECMA/projet_ECMA/trunk/lib/libsdp.a")
#find_package(CSDP REQUIRED)
SET (BLAS "/usr/lib/libcblas.a")
SET (LAPACK "/usr/lib/liblapack.a")
SET (CSDP "/home/hassan/Bureau/ECMA/projet_ECMA/trunk/lib/libsdp.a")
# Les options de compilation
# add_definitions(-Wall -Wextra -ansi -O2 -Wwrite-strings
# -Wuninitialized -Wno-missing-braces
# -Wno-missing-field-initializers)
add_definitions(
# -Wno-unused-private-field # Pour inhiber un warning de cplex 12.4
# -m64
# -g
# -fPIC
# -fexceptions
# -pg
# -DNDEBUG
# -DIL_STD # Pour cplex en C++
# -std=c++11
# -o
-O3
# -pthread
#-L/home/hassan/Bureau/ECMA/projet_ECMA/trunk/lib
-ansi
-Wall
-DNOSHORTS
-DUSEGETTIME
# -lsdp
-lsdp -llapack
-latlas
-lcblas
-lgfortran
-lm
-lg2c
-lctmg -lf2c
)
# Config spécifique à un système
# - UNIX vrai sous une plateforme Unix (don macosx)
# - APPLE vrai pour un os apple (donc macosx !)
# - WIN32 : vrai sous Windows (32 et 64bit !)
if(APPLE)
message("=> Détection système Apple")
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-no_compact_unwind")
endif()
# file(
# GLOB
# srcs
# src/*.cpp
# src/*.cc
# src/*.c
# src/*.hh
# src/*.h
# )
# On définit la liste des tous les fichiers sources (dont les includes)
# cmale se débrouillera pour trouver le main() et les dépendances.
# On peut préciser des sous-répertoires, des groupes de fichiers, ...
# Mais ATTENTION aux fichiers inutilisés : ils seront compiler et peuvent
# provoquer des erreurs. Il peut donc être référable de préciser exactement les
# fichiers sources
file(
GLOB
srcs
# src/site.*
# src/station.*
# src/remorque.*
# src/arc.*
# src/util.*
# src/logger.*
# src/options.*
# src/bench.*
# src/*Solver.*
# src/solver.*
# src/cir.*
# src/solu.*
# src/main.*
# src/*hpp
# /home/hassan/Bureau/ECMA/projet_ECMA/trunk/include/*.*
# src/*cpp
src/*.cc
src/*.hh
src/example.c
src/*.h
# src/*.*
)
# Le ou les exécutables à générer
add_executable(${EXE} ${srcs})
# Les répertoire ou chercher vos includes (ou ceux de cplex, ...)
include_directories(
# ${PROJECT_SOURCE_DIR}
# ${PROJECT_BINARY_DIR}
#$ENV{CONCERT_INCLUDE_DIR}
$ENV{CSDP_INCLUDE}
#$ENV{CPOPTIMIZER_INCLUDE_DIR}
#$ENV{CPLEX_INCLUDE_DIR}
# $ENV{LEMON_INCLUDE}
#$ENV{CPOPTIM_INCLUDE_DIR}
# $ENV{GLPK_INCLUDE}
)
# Ajouter ici les répertoires de vos bib. dynamiques utilisées
#
link_directories(
# ${PROJECT_BINARY_DIR}/lemon
# $ENV{LEMON_LIB}
# $ENV{GLPK_LIB}
$ENV{CSDP_LIB}
# $ENV{CONCERT_LIB_DIR}
# $ENV{CPLEX_LIB_DIR}
)
#find_library(CPLEX cplex HINTS $ENV{CPLEX_LIB_DIR})
#find_library(ILO_CPLEX ilocplex HINTS $ENV{CPLEX_LIB_DIR})
#find_library(CPOTIMIZER cpoptimizer HINTS $ENV{CPOPTIMIZER_LIB_DIR})
#find_library(CONCERT concert HINTS $ENV{CONCERT_LIB_DIR})
find_library(CSDP sdp HINTS $ENV{CSDP_LIB})
# Ajouter ici les bibliothèques dynamiques que vous utilisez
#
target_link_libraries(${EXE} blas) # pour programmation multithead
target_link_libraries(${EXE} lapack) # pour programmation multithead
#target_link_libraries(${EXE} sdp) # pour programmation multithead
target_link_libraries(${EXE} pthread) # pour programmation multithead
target_link_libraries(${EXE} m) # lib mathématique
target_link_libraries(${EXE} ${ILO_CPLEX}) # spécial cplex
target_link_libraries(${EXE} ${CPLEX}) # spécial cplex
target_link_libraries(${EXE} ${CPOPTIMIZER}) # spécial cplex
target_link_libraries(${EXE} ${CONCERT}) # spécial cplex
message("=> CSDP is ${CONCERT}")
#target_link_libraries(${EXE} ${BLAS}) # spécial csdp
#target_link_libraries(${EXE} ${LAPACK}) # spécial csdp
target_link_libraries(${EXE} ${CSDP}) # spécial csdp
#target_link_libraries(${EXE} ${BLAS}) # spécial csdp
# target_link_libraries(${EXE} emon) # lib de graphe
# target_link_libraries(${EXE} glpk) # solveur PLNE gratuit
# La liste des exécutables mono-fichiers à compiler
## set(demo_srcs
## main.cc
## test1.cc
## test2.cc
## )
# file(GLOB demo_srcs src/*.cc)
## foreach(demo_src ${demo_srcs})
## get_filename_component( demo_name ${demo_src} NAME_WE )
## message("=> demo_src=${demo_src}")
## message("=> demo_name=${demo_name}")
## add_executable(${demo_name} ${demo_src})
## target_link_libraries(${demo_name} emon)
## endforeach()
# Quelques messages précisant la configuration utilisée
#
message("=> CSDP_INCLUDE is $ENV{CSDP_INCLUDE}")
message("=> CSDP_LIB is $ENV{CSDP_LIB}")
message("=> ILOG_CPLEX_INCLUDE is $ENV{CPLEX_INCLUDE_DIR}")
message("=> ILOG_CPLEX_LIB is $ENV{CPLEX_LIB_DIR}")
message("=> ILOG_CONCERT_INCLUDE is $ENV{CONCERT_INCLUDE_DIR}")
message("=> ILOG_CONCERT_LIB is $ENV{CONCERT_LIB_DIR}")
# message("=> LEMON_INCLUDE is $ENV{LEMON_INCLUDE}")
# message("=> LEMON_LIB is $ENV{LEMON_LIB}")
# message("=> GLPK_INCLUDE is $ENV{GLPK_INCLUDE}")
# message("=> GLPK_LIB is $ENV{GLPK_LIB}")
message("=> srcs is ${srcs}")
# Ceci affiche 8 sur un machine 64 bits ou 4 sur un machine 32 bit
message("=> CMAKE_SIZEOF_VOID_P is ${CMAKE_SIZEOF_VOID_P}")
message("\n")
#
# Complément pour ajouter quelques cibles personnalisées dans le Makefile généré
#
EXECUTE_PROCESS(
COMMAND date +%Y%m%d-%Hh%M
OUTPUT_VARIABLE date_stamp
OUTPUT_STRIP_TRAILING_WHITESPACE
)
GET_FILENAME_COMPONENT( project_dir_name ${CMAKE_SOURCE_DIR} NAME )
# On peut compléter les cible du Makefile généré
# (la comande finale de cette ciblesera ajoutée à CMakeFiles/Makefile2)
# (puis Essayer de créer un cmake tbz !!)
ADD_CUSTOM_TARGET(distclean
COMMAND #echo Nettoyage complet des sources
COMMAND #echo \"Répertoire courant = `pwd`\"
COMMAND #echo "CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
# COMMAND make clean
COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name "CMakeCache.txt" | xargs rm -rf
COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/*
)
ADD_CUSTOM_TARGET(dc
COMMAND make distclean
)
ADD_CUSTOM_TARGET(cc
COMMAND make distclean
)
ADD_CUSTOM_TARGET(c
COMMAND make clean
)
# Attention : cette commande construit une cible pour le Makefile.
# Il faut protéger les double-quote si l'on veux qu'elles ne soient pas consommées
# par cmake mais passée au Makefile.
# Un seul COMMENT par cible semble-t-il
ADD_CUSTOM_TARGET(tbz
COMMENT "Création d'une archive datée du projet"
COMMAND #echo \" => duplication du projet en : ${project_dir_name}-${date_stamp}\"
COMMAND cp -Rp ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}-${date_stamp}
COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}/build/
COMMAND mkdir -p ${CMAKE_SOURCE_DIR}-${date_stamp}/build/
# tar -C newDir : pour se placer dans le répertoire parent de l'archive
COMMAND tar cjf ${CMAKE_SOURCE_DIR}-${date_stamp}.tbz
-C ${CMAKE_SOURCE_DIR}/..
${project_dir_name}-${date_stamp}
COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}
COMMAND #echo \" => Archive faite : ${project_dir_name}-${date_stamp}.tbz\"
)
ADD_CUSTOM_TARGET(txz
COMMENT "Création d'une archive datée du projet (TEST XZ)"
COMMAND #echo \" => duplication du projet en : ${project_dir_name}-${date_stamp}\"
COMMAND cp -Rp ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}-${date_stamp}
COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}/build/
COMMAND mkdir -p ${CMAKE_SOURCE_DIR}-${date_stamp}/build/
# tar -C newDir : pour se placer dans le répertoire parent de l'archive
COMMAND tar cf ${CMAKE_SOURCE_DIR}-${date_stamp}.tar
-C ${CMAKE_SOURCE_DIR}/..
${project_dir_name}-${date_stamp}
COMMAND xz ${CMAKE_SOURCE_DIR}-${date_stamp}.tar
COMMAND mv ${CMAKE_SOURCE_DIR}-${date_stamp}.tar.xz ${CMAKE_SOURCE_DIR}-${date_stamp}.txz
COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}
COMMAND #echo \" => Archive faite : ${project_dir_name}-${date_stamp}.tbz\"
)
# ADD_CUSTOM_TARGET(zip
# COMMENT "Création d'une archive datée du proje (TEST ZIP°t"
# COMMAND #echo \" => duplication du projet en : ${project_dir_name}-${date_stamp}\"
# COMMAND cp -Rp ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}-${date_stamp}
# COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}/build/
# COMMAND mkdir -p ${CMAKE_SOURCE_DIR}-${date_stamp}/build/
# COMMAND echo \"1: CMAKE_SOURCE_DIR-date_stamp==1==${CMAKE_SOURCE_DIR}-${date_stamp}\"
# COMMAND echo \"2: project_dir_name-date_stamp==2==${project_dir_name}-${date_stamp}\"
# # tar -C newDir : pour se placer dans le répertoire parent de l'archive
# # COMMAND '_pwd=`pwd`'
# # COMMAND pushd ${CMAKE_SOURCE_DIR}/..
# COMMAND echo 'pushd; zip -r -v -y -o -9 ${CMAKE_SOURCE_DIR}-${date_stamp}.zip \
# ${project_dir_name}-${date_stamp} ; popd'
# COMMAND sh -c "pushd; zip -r -v -y -o -9 ${CMAKE_SOURCE_DIR}-${date_stamp}.zip \
# ${project_dir_name}-${date_stamp} ; popd"
# # COMMAND zip -r -v -y -o -9 ${CMAKE_SOURCE_DIR}-${date_stamp}.zip
# # ${project_dir_name}-${date_stamp}
# COMMAND 'cd $_pwd'
# # COMMAND popd
# COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}
# COMMAND #echo \" => Archive faite : ${project_dir_name}-${date_stamp}.tbz\"
# )
INCLUDE(InstallRequiredSystemLibraries)
IF(WIN32 AND NOT UNIX)
SET(CPACK_NSIS_MODIFY_PATH ON)
ENDIF(WIN32 AND NOT UNIX)
INCLUDE(CPack)
#./
The problem is, I think that libsdp.a need library (blas, lapack and math) but, even if I add it in my Cmake, he don't succeed to find it :
[100%] Building C object CMakeFiles/run.dir/src/example.c.o
/usr/bin/cc -DNOSHORTS -DUSEGETTIME -I/home/hassan/Bureau/ECMA/projet_ECMA/trunk/include -O3 -ansi -Wall -lsdp -llapack -latlas -lcblas -lgfortran -lm -lg2c -lctmg -lf2c -o CMakeFiles/run.dir/src/example.c.o -c /home/hassan/Bureau/ECMA/projet_ECMA/src/example.c
/home/hassan/Bureau/ECMA/projet_ECMA/src/example.c: In function ‘main’:
/home/hassan/Bureau/ECMA/projet_ECMA/src/example.c:62:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
printf("%d \n", sqrt(2));
^
Linking C executable run
/usr/bin/cmake -E cmake_link_script CMakeFiles/run.dir/link.txt --verbose=1
/usr/bin/cc CMakeFiles/run.dir/src/example.c.o -o run -rdynamic -lblas -llapack -lpthread -lm trunk/lib/libsdp.a
trunk/lib/libsdp.a(initsoln.o): dans la fonction « initsoln »:
initsoln.c:(.text+0x2a9): référence indéfinie vers « sqrt »
initsoln.c:(.text+0x2ed): référence indéfinie vers « sqrt »
initsoln.c:(.text+0x334): référence indéfinie vers « sqrt »
trunk/lib/libsdp.a(norms.o): dans la fonction « norm2 »:
norms.c:(.text+0x1d): référence indéfinie vers « dnrm2_ »
trunk/lib/libsdp.a(norms.o): dans la fonction « norm1 »:
norms.c:(.text+0x4d): référence indéfinie vers « dasum_ »
trunk/lib/libsdp.a(norms.o): dans la fonction « norminf »:
norms.c:(.text+0x81): référence indéfinie vers « idamax_ »
trunk/lib/libsdp.a(sdp.o): dans la fonction « sdp »:
sdp.c:(.text+0x1ed7): référence indéfinie vers « dpotrf_ »
sdp.c:(.text+0x2104): référence indéfinie vers « pow »
sdp.c:(.text+0x7cf3): référence indéfinie vers « sqrt »
sdp.c:(.text+0x8651): référence indéfinie vers « sqrt »
sdp.c:(.text+0x88eb): référence indéfinie vers « sqrt »
sdp.c:(.text+0x88f5): référence indéfinie vers « sqrt »
sdp.c:(.text+0x8968): référence indéfinie vers « pow »
sdp.c:(.text+0x89bd): référence indéfinie vers « sqrt »
sdp.c:(.text+0x89e9): référence indéfinie vers « sqrt »
trunk/lib/libsdp.a(Fnorm.o): dans la fonction « Fnorm »:
Fnorm.c:(.text+0xcb): référence indéfinie vers « sqrt »
trunk/lib/libsdp.a(calc_dobj.o): dans la fonction « calc_dobj »:
calc_dobj.c:(.text+0x2d): référence indéfinie vers « ddot_ »
trunk/lib/libsdp.a(mat_mult.o): dans la fonction « mat_mult »:
mat_mult.c:(.text+0xef): référence indéfinie vers « dgemm_ »
trunk/lib/libsdp.a(mat_mult.o): dans la fonction « mat_mult_raw »:
mat_mult.c:(.text+0x479): référence indéfinie vers « dgemm_ »
trunk/lib/libsdp.a(solvesys.o): dans la fonction « solvesys »:
solvesys.c:(.text+0x40): référence indéfinie vers « dpotrs_ »
trunk/lib/libsdp.a(linesearch.o): dans la fonction « linesearch »:
linesearch.c:(.text+0x39f): référence indéfinie vers « dgemv_ »
linesearch.c:(.text+0x416): référence indéfinie vers « dgemv_ »
linesearch.c:(.text+0x488): référence indéfinie vers « dgemv_ »
linesearch.c:(.text+0x4ff): référence indéfinie vers « dgemv_ »
linesearch.c:(.text+0xe2b): référence indéfinie vers « sqrt »
trunk/lib/libsdp.a(matvec.o): dans la fonction « matvec »:
matvec.c:(.text+0xb8): référence indéfinie vers « dgemv_ »
trunk/lib/libsdp.a(chol.o): dans la fonction « chol_blk »:
chol.c:(.text+0x36): référence indéfinie vers « dpotrf_ »
trunk/lib/libsdp.a(chol.o): dans la fonction « chol_diag »:
chol.c:(.text+0x134): référence indéfinie vers « sqrt »
trunk/lib/libsdp.a(chol.o): dans la fonction « chol »:
chol.c:(.text+0x1bd): référence indéfinie vers « dpotrf_ »
chol.c:(.text+0x2e1): référence indéfinie vers « sqrt »
trunk/lib/libsdp.a(chol.o): dans la fonction « chol_inv »:
chol.c:(.text+0x42f): référence indéfinie vers « dtrtri_ »
trunk/lib/libsdp.a(qreig.o): dans la fonction « qreig »:
qreig.c:(.text+0x539): référence indéfinie vers « sqrt »
qreig.c:(.text+0x64f): référence indéfinie vers « sqrt »
qreig.c:(.text+0x718): référence indéfinie vers « sqrt »
collect2: error: ld returned 1 exit status
make[2]: *** [run] Erreur 1
Not really an answer. This is my CMake file I include for building with blas/lapack, if it can help you. It requires the following variables : DefaultLapackPath, CompilerName (lowercase), and a cpp file GetLapackVersion.cpp in a directory given by ${CMAKE_MODULES_DIR} (see below).
File LoadLapack.cmake :
set(LapackPath "${DefaultLapackPath}" CACHE PATH "Path to Lapack installation")
if(NOT "${LapackPath}" STREQUAL "${LapackPath_copy}")
unset(LibBlas CACHE)
unset(LibLapack CACHE)
set(LapackPath_copy "${LapackPath}" CACHE INTERNAL "")
endif()
message(STATUS "Path to Lapack: ${LapackPath}")
set(Lapack_LIBRARY_DIRS ${LapackPath}/lib)
find_library(LibBlas blas PATHS ${Lapack_LIBRARY_DIRS} DOC "Complete path to blas library" NO_DEFAULT_PATH)
find_library(LibLapack lapack PATHS ${Lapack_LIBRARY_DIRS} DOC "Complete path to lapack library" NO_DEFAULT_PATH)
if(EXISTS "${LibBlas}" AND EXISTS "${LibLapack}")
message(STATUS "Lapack libraries found !")
else()
message(SEND_ERROR "Lapack libraries not found...")
endif()
if(CompilerName STREQUAL "gcc")
set(Fortran_LIBRARIES gfortran)
endif()
set(Lapack_LIBRARIES lapack blas)
set(NAME_MANGLING_OPTIONS
"NameManglingUpper"
"NameManglingLower"
"NameManglingUBack"
"NameMangling2UBack"
"NameManglingUFront"
"NameMangling2UFront")
set(LAPACK_NAME_MANGLING "")
foreach(NAME_MANGLING_OPTION IN LISTS NAME_MANGLING_OPTIONS)
set(LAPACK_NAME_MANGLING "${NAME_MANGLING_OPTION}")
set(TRY_MANGLING_LIBRARY_DIRS ${Lapack_LIBRARY_DIRS} ${Compiler_LIBRARY_DIRS})
set(TRY_MANGLING_LIBRARIES ${Lapack_LIBRARIES} ${Fortran_LIBRARIES})
try_compile(TRY_MANGLING_OPTION ${CMAKE_BINARY_DIR}/tmpLapack ${CMAKE_MODULES_DIR}/GetLapackVersion.cpp
CMAKE_FLAGS "-DLINK_DIRECTORIES=${TRY_MANGLING_LIBRARY_DIRS}" "-DLINK_LIBRARIES=${TRY_MANGLING_LIBRARIES}"
COMPILE_DEFINITIONS "-DLapack${NAME_MANGLING_OPTION}")
if(TRY_MANGLING_OPTION)
set(LAPACK_NAME_MANGLING "Lapack${NAME_MANGLING_OPTION}")
break()
endif()
endforeach()
if(LAPACK_NAME_MANGLING STREQUAL "")
message(SEND_ERROR "Impossible to detect Fortran name mangling...")
else()
message(STATUS "Lapack: detected Fortran name mangling: ${LAPACK_NAME_MANGLING}")
add_definitions("-D${LAPACK_NAME_MANGLING}")
endif()
set(GET_LAPACK_VERSION_LIBRARY_DIRS ${Lapack_LIBRARY_DIRS} ${Compiler_LIBRARY_DIRS})
set(GET_LAPACK_VERSION_LIBRARIES ${Lapack_LIBRARIES} ${Fortran_LIBRARIES})
try_run(GET_LAPACK_VERSION_RUN GET_LAPACK_VERSION_COMPILE ${CMAKE_BINARY_DIR}/tmpLapack ${CMAKE_MODULES_DIR}/GetLapackVersion.cpp
CMAKE_FLAGS "-DLINK_DIRECTORIES=${GET_LAPACK_VERSION_LIBRARY_DIRS}" "-DLINK_LIBRARIES=${GET_LAPACK_VERSION_LIBRARIES}"
COMPILE_DEFINITIONS "-D${LAPACK_NAME_MANGLING}"
COMPILE_OUTPUT_VARIABLE GET_LAPACK_VERSION_COMPILE_OUT RUN_OUTPUT_VARIABLE GET_LAPACK_VERSION_RUN_OUT)
if(NOT GET_LAPACK_VERSION_COMPILE)
message(SEND_ERROR "Impossible to compile the file \"${CMAKE_MODULES_DIR}/GetLapackVersion.cpp\". Output: ${GET_LAPACK_VERSION_COMPILE_OUT}")
elseif(NOT GET_LAPACK_VERSION_RUN_OUT MATCHES "^[0-9]+.[0-9]+.[0-9]+")
message(SEND_ERROR "Error while running GetLapackVersion:${GET_LAPACK_VERSION_RUN_OUT}XXX")
else()
string(STRIP "${GET_LAPACK_VERSION_RUN_OUT}" LapackVersion)
if(LapackVersion VERSION_LESS "${RequiredLapackVersion}")
message(SEND_ERROR "The version of Lapack (${LapackVersion}) is too old")
else()
message(STATUS "Lapack version: ${LapackVersion}")
endif()
endif()
mark_as_advanced(LibBlas FORCE)
mark_as_advanced(LibLapack FORCE)
File GetLapackVersion.cpp :
#include <iostream>
#if defined LapackNameManglingUpper
#define ilaver ILAVER
#elif defined LapackNameManglingLower
#define ilaver ilaver
#elif defined LapackNameManglingUBack
#define ilaver ilaver_
#elif defined LapackNameMangling2UBack
#define ilaver ilaver__
#elif defined LapackNameManglingUFront
#define ilaver _ilaver
#elif defined LapackNameMangling2UFront
#define ilaver __ilaver
#endif
extern "C" { void ilaver(int* major, int* minor, int* patch); }
int main()
{
int major = 0; int minor = 0; int patch = 0;
ilaver(&major, &minor, &patch);
std::cout << major << "." << minor << "." << patch << std::endl;
return 0;
}
Then I define my blas/lapack header file like that :
File blas.h :
#ifndef _INCLUDED__BLAS_H_
#define _INCLUDED__BLAS_H_
#if defined LapackNameManglingUpper
# define dgemm DGEMM
# define dsymm DSYMM
# define dtrmm DTRMM
#elif defined LapackNameManglingLower
# define dgemm dgemm
# define dsymm dsymm
# define dtrmm dtrmm
#elif defined LapackNameManglingUBack
# define dgemm dgemm_
# define dsymm dsymm_
# define dtrmm dtrmm_
#elif defined LapackNameMangling2UBack
# define dgemm dgemm__
# define dsymm dsymm__
# define dtrmm dtrmm__
#elif defined LapackNameManglingUFront
# define dgemm _dgemm
# define dsymm _dsymm
# define dtrmm _dtrmm
#elif defined LapackNameMangling2UFront
# define dgemm __dgemm
# define dsymm __dsymm
# define dtrmm __dtrmm
#endif
namespace blas
{
extern "C"
{
void dgemm(char* transa, char* transb, int* m, int* n, int* k, double* alpha, double* A, int* lda, double* B, int* ldb, double* beta, double* C, int* ldc);
void dsymm(char* side, char* uplo, int* m, int* n, double* alpha, double* A, int* lda, double* B, int* ldb, double* beta, double* C, int* ldc);
void dtrmm(char* side, char* uplo, char* transa, char* diag, int* m, int* n, double* alpha, double* A, int* lda, double* B, int* ldb);
}
}
#endif
Then, I can build my executable with this kind of CMake file :
link_directories( ${Lapack_LIBRARY_DIRS} )
set( MyApp_UsedLib
${Lapack_LIBRARIES}
${Fortran_LIBRARIES}
)
add_executable( myapp my_app.cpp )
target_link_libraries(myapp ${MyApp_UsedLib})