Cmake Error undefined reference when linking cxx executable - c++

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)

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

macosx + conan + cmake build resulting in undefined symbols for architecture x86_64?

I've been packaging a few conan recipes with varied success.. but now getting stuck on one package in particular
https://github.com/smasherprog/screen_capture_lite/issues/115
conanfile.py
from conans import ConanFile, CMake, tools
class ScreenCapLiteConan(ConanFile):
name = "ScreenCaptureLite"
version = "11.0.0"
license = "MIT"
author = "smasherprog#gmail.com"
url = "https://github.com/smasherprog/screen_capture_lite/"
description = "Capture screen grabs in C++"
topics = ("screengrab", "capture")
settings = "os", "compiler", "build_type", "arch"
options = {"shared": [True, False]}
default_options = {"shared": False}
generators = "cmake"
def source(self):
self.run("git clone --depth 1 --branch v11.0.0 git#github.com:smasherprog/screen_capture_lite.git")
def build(self):
cmake = CMake(self)
cmake.configure(source_folder="screen_capture_lite")
cmake.build()
def package(self):
self.copy("*.h", dst="include", src="screen_capture_lite/include", keep_path=False)
self.copy("*hello.lib", dst="lib", keep_path=False)
self.copy("*.dll", dst="bin", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
self.copy("*.dylib", dst="lib", keep_path=False)
self.copy("*.a", dst="lib", keep_path=False)
def package_info(self):
self.cpp_info.libs = ["ScreenCaptureLite"]
this uploads to my registry just fine and I can see indeed there is a libscreen_cab.a of some sort saved
but when I goto try and use this library to create the libraries example in a new project.. it errors
CMakeLists.txt (of the consuming project)
cmake_minimum_required(VERSION 2.8.12)
project(scl_app_server)
add_compile_options(-std=c++17)
# Using the "cmake" generator
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
FILE ( GLOB SCL_APP_SRC src/*.cpp )
add_executable(scl_app_server ${SCL_APP_SRC} )
target_link_libraries(scl_app_server pthread CONAN_PKG::ScreenCaptureLite)
The following is what happens after I conan install the following
[requires]
ScreenCaptureLite/11.0.0#namespace/prod
[generators]
cmake
The commands executed emitting the error
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
-- The C compiler identification is AppleClang 13.0.0.13000029
-- The CXX compiler identification is AppleClang 13.0.0.13000029
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/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: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Conan: Adjusting output directories
-- Conan: Using cmake targets configuration
-- Library libscreen_capture found /Users/emcp/.conan/data/libscreen_capture/11.0.0/prod/package/2cd20192e71f56e1115fbdc2ebf2871bb61152e4/lib/liblibscreen_capture.a
-- Conan: Adjusting default RPATHs Conan policies
-- Conan: Adjusting language standard
-- Current conanbuildinfo.cmake directory: /Users/emcp/Dev/git/screen-cap-lite-server/build
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/emcp/Dev/git/screen-cap-lite-server/build
[ 33%] Building CXX object CMakeFiles/scl_app_server.dir/src/Screen_Capture_Example.cpp.o
[ 66%] Building CXX object CMakeFiles/scl_app_server.dir/src/lodepng.cpp.o
[100%] Linking CXX executable bin/scl_app_server
Undefined symbols for architecture x86_64:
"_CFDataGetBytePtr", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CFDataGetLength", referenced from:
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CFRelease", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
_SLScreen_Capture_GetCurrentMouseImage in liblibscreen_capture.a(NSMouseCapture.m.o)
"_CGDataProviderCopyData", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGDisplayBounds", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGDisplayCopyDisplayMode", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGDisplayCreateImage", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
"_CGDisplayCreateImageForRect", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
"_CGDisplayMirrorsDisplay", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGDisplayModeGetPixelHeight", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGDisplayModeGetPixelWidth", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGDisplayModeRelease", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGEventCreate", referenced from:
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGEventGetLocation", referenced from:
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGGetActiveDisplayList", referenced from:
SL::Screen_Capture::GetMonitors() in liblibscreen_capture.a(GetMonitors.cpp.o)
"_CGImageGetBitsPerPixel", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
"_CGImageGetBytesPerRow", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
"_CGImageGetDataProvider", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGImageGetHeight", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGImageGetWidth", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGImageRelease", referenced from:
SL::Screen_Capture::CGFrameProcessor::ProcessFrame(SL::Screen_Capture::Monitor const&) in liblibscreen_capture.a(CGFrameProcessor.cpp.o)
SL::Screen_Capture::NSMouseProcessor::ProcessFrame() in liblibscreen_capture.a(NSMouseProcessor.cpp.o)
"_CGImageSourceCreateImageAtIndex", referenced from:
_SLScreen_Capture_GetCurrentMouseImage in liblibscreen_capture.a(NSMouseCapture.m.o)
"_CGImageSourceCreateWithData", referenced from:
_SLScreen_Capture_GetCurrentMouseImage in liblibscreen_capture.a(NSMouseCapture.m.o)
"_OBJC_CLASS_$_NSApplication", referenced from:
objc-class-ref in liblibscreen_capture.a(NSMouseCapture.m.o)
"_OBJC_CLASS_$_NSCursor", referenced from:
objc-class-ref in liblibscreen_capture.a(NSMouseCapture.m.o)
"_objc_autoreleasePoolPop", referenced from:
_SLScreen_Capture_GetCurrentMouseImage in liblibscreen_capture.a(NSMouseCapture.m.o)
"_objc_autoreleasePoolPush", referenced from:
_SLScreen_Capture_GetCurrentMouseImage in liblibscreen_capture.a(NSMouseCapture.m.o)
"_objc_msgSend", referenced from:
_SLScreen_Capture_InitMouseCapture in liblibscreen_capture.a(NSMouseCapture.m.o)
_SLScreen_Capture_GetCurrentMouseImage in liblibscreen_capture.a(NSMouseCapture.m.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [bin/scl_app_server] Error 1
make[1]: *** [CMakeFiles/scl_app_server.dir/all] Error 2
make: *** [all] Error 2
Edit:
seems the author got back to me and showed me I need to add some things.. I am unsure how to add it to a conan based CMakeLists.txt but it's all the apple things
https://github.com/smasherprog/screen_capture_lite/blob/master/Example_CPP/CMakeLists.txt
project(screen_capture_example_cpp)
if(WIN32)
set(${PROJECT_NAME}_PLATFORM_LIBS Dwmapi)
add_definitions(-DNOMINMAX)
elseif(APPLE)
find_package(Threads REQUIRED)
find_library(corefoundation_lib CoreFoundation REQUIRED)
find_library(cocoa_lib Cocoa REQUIRED)
find_library(coremedia_lib CoreMedia REQUIRED)
find_library(avfoundation_lib AVFoundation REQUIRED)
find_library(coregraphics_lib CoreGraphics REQUIRED)
find_library(corevideo_lib CoreVideo REQUIRED)
set(${PROJECT_NAME}_PLATFORM_LIBS
${CMAKE_THREAD_LIBS_INIT}
${corefoundation_lib}
${cocoa_lib}
${coremedia_lib}
${avfoundation_lib}
${coregraphics_lib}
${corevideo_lib}
)
else()
find_package(X11 REQUIRED)
if(!X11_XTest_FOUND)
message(FATAL_ERROR "X11 extensions are required, but not found!")
endif()
if(!X11_Xfixes_LIB)
message(FATAL_ERROR "X11 fixes extension is required, but not found!")
endif()
find_package(Threads REQUIRED)
set(${PROJECT_NAME}_PLATFORM_LIBS
${X11_LIBRARIES}
${X11_Xfixes_LIB}
${X11_XTest_LIB}
${X11_Xinerama_LIB}
${CMAKE_THREAD_LIBS_INIT}
)
endif()
include_directories(
../include
)
add_executable(${PROJECT_NAME}_static
lodepng.cpp
Screen_Capture_Example.cpp
)
target_link_libraries(${PROJECT_NAME}_static screen_capture_lite_static ${${PROJECT_NAME}_PLATFORM_LIBS})
add_executable(${PROJECT_NAME}_shared
lodepng.cpp
Screen_Capture_Example.cpp
)
target_link_libraries(${PROJECT_NAME}_shared screen_capture_lite_shared ${${PROJECT_NAME}_PLATFORM_LIBS})
install (TARGETS ${PROJECT_NAME}_static ${PROJECT_NAME}_shared screen_capture_lite_shared
RUNTIME DESTINATION Examples
)
do I just add these lines to my CMakeLists.txt the same?
it turned out the version I had pulled from github was super ancient.. once I updated my recipe to pull from the latest.. it was apparent that my consuming CMakeLists.txt was missing all sorts of apple libraries..
I modified slightly the authors original.. added the conan logic.. and most importantly learned how to add logic so that conan can make sense if you want static or dynamic libraries
my conanfile.py
from conans import ConanFile, CMake, tools
class ScreenCapLiteConan(ConanFile):
name = "screen_capture_lite"
version = "17.1.439"
license = "MIT"
author = "smasherprog#gmail.com"
url = "https://github.com/smasherprog/screen_capture_lite"
description = "Capture screen grabs in Mac OSX"
topics = ("screengrab", "capture")
settings = "os", "compiler", "build_type", "arch"
options = {"shared": [True, False]}
default_options = {"shared": False}
generators = "cmake"
def source(self):
self.run("git clone --depth 1 --branch 17.1.439 git#github.com:smasherprog/screen_capture_lite.git")
def build(self):
cmake = CMake(self)
cmake.configure(source_folder="screen_capture_lite")
cmake.build()
def package(self):
self.copy("*.h", dst="include", src="screen_capture_lite/include")
self.copy("*hello.lib", dst="lib", keep_path=False)
self.copy("*.dll", dst="bin", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
self.copy("*.dylib", dst="lib", keep_path=False)
self.copy("*.a", dst="lib", keep_path=False)
def package_info(self):
if self.settings.os == "Macos":
self.cpp_info.libs = ["libscreen_capture_lite_static.a"] if not self.options.shared else ["libscreen_capture_lite_shared.dylib"]
elif self.settings.os == "Linux":
self.cpp_info.libs = ["libscreen_capture_lite_static.a"] if not self.options.shared else ["libscreen_capture_lite_shared.so"]
notice the last lines where I have to add the logic for the different libraries
then my consuming project just needs the following
conanfile.txt
[requires]
screen_capture_lite/17.1.439#emcp/prod
[generators]
cmake
[options]
screen_capture_lite:shared=False
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(osx_screengrabber)
add_compile_options(-std=c++17)
# Using the "cmake" generator
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
if(WIN32)
set(${PROJECT_NAME}_PLATFORM_LIBS Dwmapi)
add_definitions(-DNOMINMAX)
elseif(APPLE)
find_package(Threads REQUIRED)
find_library(corefoundation_lib CoreFoundation REQUIRED)
find_library(cocoa_lib Cocoa REQUIRED)
find_library(coremedia_lib CoreMedia REQUIRED)
find_library(avfoundation_lib AVFoundation REQUIRED)
find_library(coregraphics_lib CoreGraphics REQUIRED)
find_library(corevideo_lib CoreVideo REQUIRED)
set(${PROJECT_NAME}_PLATFORM_LIBS
${CMAKE_THREAD_LIBS_INIT}
${corefoundation_lib}
${cocoa_lib}
${coremedia_lib}
${avfoundation_lib}
${coregraphics_lib}
${corevideo_lib}
)
else()
find_package(X11 REQUIRED)
if(!X11_XTest_FOUND)
message(FATAL_ERROR "X11 extensions are required, but not found!")
endif()
if(!X11_Xfixes_LIB)
message(FATAL_ERROR "X11 fixes extension is required, but not found!")
endif()
find_package(Threads REQUIRED)
set(${PROJECT_NAME}_PLATFORM_LIBS
${X11_LIBRARIES}
${X11_Xfixes_LIB}
${X11_XTest_LIB}
${X11_Xinerama_LIB}
${CMAKE_THREAD_LIBS_INIT}
)
endif()
add_executable(${PROJECT_NAME}_static
src/lodepng.cpp
src/osx_screengrabber.cpp
)
target_link_libraries(${PROJECT_NAME}_static CONAN_PKG::screen_capture_lite ${${PROJECT_NAME}_PLATFORM_LIBS} )
this fixed everything and I copied the original authors example project of the same git tag v17.1.439 into it's own repo.. fired up conan and cmake.. and it's all working now
thanks Conan! and screen_capture_lite!

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;
}

Catkin/Ros "undefined reference to"

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.

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})