My программного обеспечения, составленного штрафа на Linux несколько месяцев назад перестал компиляции на моем новом убунту:Linking терпит неудачу с CMake, DSO-Link-Change
Linking CXX executable myApp
/usr/bin/ld: ../libMyLib/libMyLib.a(MyFile.cpp.o): undefined reference to symbol '_ZN2cv6resizeERKNS_11_InputArrayERKNS_12_OutputArrayENS_5Size_IiEEddi'
/usr/bin/ld: note: '_ZN2cv6resizeERKNS_11_InputArrayERKNS_12_OutputArrayENS_5Size_IiEEddi' is defined in DSO /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libopencv_imgproc.so so try adding it to the linker command line
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libopencv_imgproc.so: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make[2]: *** [myApp/myApp] Error 1
make[1]: *** [myApp/CMakeFiles/myApp.dir/all] Error 2
make: *** [all] Error 2
Я предполагаю, что это связано с https://fedoraproject.org/wiki/UnderstandingDSOLinkChange.
Мой проект (все cmake) содержит несколько библиотек и приложение, как библиотеки, так и приложение зависят от opencv и/или boost (каждый на некоторых разных). Мои собственные библиотеки создаются как .a-файлы, ocv/boost вставляются в качестве разделяемых библиотек, а связь приложения с ошибкой выше.
Я также пытался создать свои собственные библиотеки как SHARED, но это привело к еще большему количеству ошибок. В CMakeLists моих библиотек выглядеть
FIND_PACKAGE(Boost REQUIRED)
FIND_PACKAGE(OpenCV REQUIRED core)
...stuff...
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${Boost_INCLUDE_DIRS})
add_library(${SUBPROJECT_NAME} ${SOURCE} ${HEADERS})
The CMakeLists приложения выглядит
FIND_PACKAGE(OpenCV REQUIRED core imgproc highgui)
include_directories(${OpenCV_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${SUBPROJECT_NAME} ${OpenCV_LIBS} MyLib)
Это все правильно, и я всегда думал, что это способ сделать это, но теперь с этим DSO вещи я просто не могу получить он больше работает.
Если это необходимо, я попытался использовать CMake 2.8.7 и 2.8.10 и g ++ 4.7.2 и 4.8, все производят те же ошибки.
Я не помню, имеет ли порядок библиотек значение в CMake (т. Е. Передает ли он в надлежащем порядке GCC), но это, безусловно, имеет значение для самого GCC. Может быть, вы должны поставить 'MyLib' перед' $ {OpenCV_LIBS} '? –
О, чувак, ты должен шутить ... когда MyLib зависит от $ {OpenCV_LIBS}, он должен идти до него на cmdline? Это очень неинтуитивно для меня, я думаю, сначала вам нужно связать с $ {OpenCV_LIBS} (тогда это «определено»), а затем связать с MyLib, который зависит от $ {OpenCV_LIBS} и который может его найти сейчас ... Но на самом деле вы правы, и я ошибался с тех пор, как использовал gcc ... Если вы сформулируете это как ответ, я соглашусь ... :-) Спасибо, так глупо ... – Ela782