Undefined symbol with static build opencv

Hi there,

I have a build script for opencv (using manjaro linux):


OPENCV_VERSION=4.5.1


cd CMAKE 
rm -rf opencv || ls
mkdir -p opencv
curl -L https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.tar.gz | tar xz -C opencv --strip-components 1
mkdir -p opencv/build 
cd opencv/build

cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=OFF \
    -DBUILD_ZLIB=ON \
    -DBUILD_PNG=ON \
    -DWITH_PNG=ON \
    -DWITH_OPENEXR=OFF \
    -DWITH_JPEG=ON \
    -DBUILD_JASPER=ON \
    -DWITH_JASPER=ON \
    -DBUILD_TBB=ON \
    -DWITH_TBB=ON \
    -DWITH_TIFF=ON \
    -DWITH_WEBP=OFF \
    -DWITH_OPENCL=OFF \
    -DWITH_GTK=OFF \
    -DWITH_FFMPEG=OFF \
    -DWITH_1394=OFF \
    -DWITH_IPP=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DBUILD_opencv_apps=OFF \
    -DOPENCV_GENERATE_PKGCONFIG=ON \
    -DOPENCV_FORCE_3RDPARTY_BUILD=ON \
    -DBUILD_WITH_STATIC_CRT=OFF \
    -DCMAKE_INSTALL_PREFIX=opencv_install \
    ..

make -j 4 
make install 
cd ../..

then I wan to build a library on my own linking opencv using this:


cmake_minimum_required(VERSION 3.10)

project(mylib VERSION 0.1)


set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

find_package(OpenCV 4.5.1 EXACT REQUIRED PATHS "${PATH_TO_OPENCV_SRC}/opencv/build/opencv_install/lib/cmake/opencv4/")
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories( ${CMAKE_BINARY_DIR}/bin)

message("NOW INCLUDE DIR: ")
message(${OpenCV_INCLUDE_DIRS})
message(("NOW LIBS DIR: "))
message(${OpenCV_LIBS})


add_library(mylib SHARED "src/mylib.cxx")

target_include_directories(mylib PUBLIC "include")

target_link_libraries(mylib PUBLIC ${OpenCV_LIBS})

target_link_libraries( mylib PUBLIC dl )
#m
target_link_libraries( mylib PUBLIC m )
#pthread
target_link_libraries( mylib PUBLIC pthread )
#rt
target_link_libraries( mylib PUBLIC rt )


I get the following linking error on the resulting .so:


ldd -r libdenk.so 
	linux-vdso.so.1 (0x00007ffd1bd8f000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f8195ade000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8195abc000)
	librt.so.1 => /usr/lib/librt.so.1 (0x00007f8195aaf000)
	libgstbase-1.0.so.0 => /usr/lib/libgstbase-1.0.so.0 (0x00007f8195a2e000)
	libgstreamer-1.0.so.0 => /usr/lib/libgstreamer-1.0.so.0 (0x00007f81958e5000)
	libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007f819588d000)
	libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f8195759000)
	libgstapp-1.0.so.0 => /usr/lib/libgstapp-1.0.so.0 (0x00007f8195747000)
	libgstriff-1.0.so.0 => /usr/lib/libgstriff-1.0.so.0 (0x00007f8195734000)
	libgstpbutils-1.0.so.0 => /usr/lib/libgstpbutils-1.0.so.0 (0x00007f81956f5000)
	libgstaudio-1.0.so.0 => /usr/lib/libgstaudio-1.0.so.0 (0x00007f8195678000)
	libgstvideo-1.0.so.0 => /usr/lib/libgstvideo-1.0.so.0 (0x00007f81955c2000)
	libgsttag-1.0.so.0 => /usr/lib/libgsttag-1.0.so.0 (0x00007f8195581000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f819543b000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f819525c000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8195093000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f8195079000)
	libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00007f8195038000)
	/usr/lib64/ld-linux-x86-64.so.2 (0x00007f81980d0000)
	libz.so.1 => /usr/lib/libz.so.1 (0x00007f819501e000)
	libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f8195017000)
	libunwind.so.8 => /usr/lib/libunwind.so.8 (0x00007f8194ffd000)
	libdw.so.1 => /usr/lib/libdw.so.1 (0x00007f8194f5f000)
	libffi.so.7 => /usr/lib/libffi.so.7 (0x00007f8194f53000)
	libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007f8194ee1000)
	liborc-0.4.so.0 => /usr/lib/liborc-0.4.so.0 (0x00007f8194e5a000)
	liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007f8194e32000)
	libelf.so.1 => /usr/lib/libelf.so.1 (0x00007f8194e18000)
	libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007f8194e05000)
undefined symbol: _ZN2cv3dnn14dnn4_v202006098NMSBoxesERKSt6vectorINS_5Rect_IiEESaIS4_EERKS2_IfSaIfEEffRS2_IiSaIiEEfi	(./libdenk.so)


c++filt _ZN2cv3dnn14dnn4_v202006098NMSBoxesERKSt6vectorINS_5Rect_IiEESaIS4_EERKS2_IfSaIfEEffRS2_IiSaIiEEfi

results in

cv::dnn::dnn4_v20200609::NMSBoxes(std::vector<cv::Rect_, std::allocator<cv::Rect_ > > const&, std::vector<float, std::allocator > const&, float, float, std::vector<int, std::allocator >&, float, int)

so I assume opencv_dnn does not get linked properly, but why and how do I fix it?

thanks in advance!

1 Like

I just wanted to give this a push, the problem still remains.

Any update on this problem?

all I can recommend is to do a clean build.

hmm shouldn’t it be:

 target_link_libraries(mylib PUBLIC ${OpenCV_LIBS} -static)

??

also, cmake still generates some kind of makefile, it might be useful to look at that.

maybe you can show us, what it actually links ?
(remember, order matters with static linking !)