- 例子0 對‘myprojectApi::myprojectApi(bool, int, int, bool)’未定義的引用
- 例子1 源碼編譯opencv,報錯 libopencv_imgcodecs.so.3.2.0:對‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定義的引用
- 例子2 之前編譯caffe的時候也會報這個錯誤 對‘TIFFWriteEncodedStrip@LIBTIFF_4.0’未定義的引用
- 例子3 libpng16so16:對inflatevalidatezlib_129未定義的引用
- 例子4 /data_1/3rdparty/caffe/include/caffe/util/device_alternate.hpp:34:23: fatal error: cublas_v2.h: 沒有那個文件或目錄
- 例子5 not found libopencv_highgui.so:對‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定義的引用
- 例子6 一個可執行文件包換到另外一個平台跑, 提示缺庫問題
例子0 對‘myprojectApi::myprojectApi(bool, int, int, bool)’未定義的引用
這是我自己寫一個庫的測試工程時候報的錯誤。比如這個庫名字叫libyanzhengma_chejian.so
在CMakeLists.txt下面這么寫:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(yzm_test)
SET(CMAKE_BUILD_TYPE "Debug")
include_directories(${CMAKE_SOURCE_DIR}/3rdparty/opencv-3.4.10/include)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/opencv-3.4.10/lib)
# caffe
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/lib)
set(INC_DIR ${CMAKE_SOURCE_DIR}/api)
set(LINK_DIR ${CMAKE_SOURCE_DIR}/lib)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
add_executable(yzm_test main.cpp)
set_property(TARGET yzm_test PROPERTY CXX_STANDARD 11)
庫的頭文件就在${CMAKE_SOURCE_DIR}/api,庫文件就在${CMAKE_SOURCE_DIR}/lib目錄下libyanzhengma_chejian.so
這個時候編譯就報錯未定義的引用
====================[ Build | all | Debug ]=====================================
/home/yhl/software/clion-2018.3.4/bin/cmake/linux/bin/cmake --build /data_1/everyday/1028/yzm/cmake-build-debug --target all -- -j 4
[ 50%] Building CXX object CMakeFiles/yzm_test.dir/main.cpp.o
[100%] Linking CXX executable yzm_test
CMakeFiles/yzm_test.dir/main.cpp.o:在函數‘main’中:
/data_1/everyday/1028/yzm/main.cpp:8:對‘myprojectApi::myprojectApi(bool, int, int, bool)’未定義的引用
/data_1/everyday/1028/yzm/main.cpp:14:對‘cv::imread(cv::String const&, int)’未定義的引用
/data_1/everyday/1028/yzm/main.cpp:16:對‘myprojectApi::yanzhengma_api_process(cv::Mat&, YZM_ImgOutMsg&)’未定義的引用
/data_1/everyday/1028/yzm/main.cpp:8:對‘myprojectApi::~myprojectApi()’未定義的引用
CMakeFiles/yzm_test.dir/main.cpp.o:在函數‘cv::String::~String()’中:
/data_1/everyday/1028/yzm/3rdparty/opencv-3.4.10/include/opencv2/core/cvstd.hpp:648:對‘cv::String::deallocate()’未定義的引用
CMakeFiles/yzm_test.dir/main.cpp.o:在函數‘cv::String::operator=(cv::String const&)’中:
/data_1/everyday/1028/yzm/3rdparty/opencv-3.4.10/include/opencv2/core/cvstd.hpp:656:對‘cv::String::deallocate()’未定義的引用
CMakeFiles/yzm_test.dir/main.cpp.o:在函數‘cv::Mat::~Mat()’中:
/data_1/everyday/1028/yzm/3rdparty/opencv-3.4.10/include/opencv2/core/mat.inl.hpp:789:對‘cv::fastFree(void*)’未定義的引用
CMakeFiles/yzm_test.dir/main.cpp.o:在函數‘cv::Mat::release()’中:
/data_1/everyday/1028/yzm/3rdparty/opencv-3.4.10/include/opencv2/core/mat.inl.hpp:901:對‘cv::Mat::deallocate()’未定義的引用
CMakeFiles/yzm_test.dir/main.cpp.o:在函數‘cv::String::String(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’中:
/data_1/everyday/1028/yzm/3rdparty/opencv-3.4.10/include/opencv2/core/cvstd.inl.hpp:82:對‘cv::String::allocate(unsigned long)’未定義的引用
collect2: error: ld returned 1 exit status
在CMakeLists加上這句話就不報這個錯誤了。target_link_libraries(yzm_test yanzhengma_chejian)
set(INC_DIR ${CMAKE_SOURCE_DIR}/api)
set(LINK_DIR ${CMAKE_SOURCE_DIR}/lib)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
add_executable(yzm_test main.cpp)
target_link_libraries(yzm_test yanzhengma_chejian)
現在CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(yzm_test)
SET(CMAKE_BUILD_TYPE "Debug")
include_directories(${CMAKE_SOURCE_DIR}/3rdparty/opencv-3.4.10/include)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/opencv-3.4.10/lib)
# caffe
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/caffe_8)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/cuda_8)
set(INC_DIR ${CMAKE_SOURCE_DIR}/api)
set(LINK_DIR ${CMAKE_SOURCE_DIR}/lib)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
add_executable(yzm_test main.cpp)
target_link_libraries(yzm_test yanzhengma_chejian opencv_core opencv_imgproc opencv_imgcodecs opencv_highgui opencv_ml opencv_video opencv_videoio)
target_link_libraries(yzm_test caffe)
set_property(TARGET yzm_test PROPERTY CXX_STANDARD 11)
然后又報protobuf未定義的引用
/data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so:對‘google::protobuf::io::CodedInputStream::ReadVarint64Fallback()’未定義的引用
/data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so:對‘google::protobuf::MessageLite::ParseFromString2(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’未定義的引用
/data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so:對‘google::protobuf::io::CodedInputStream::IncrementRecursionDepthAndPushLimit(int)’未定義的引用
/data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so:對‘google::protobuf::internal::WireFormat::ReadPackedEnumPreserveUnknowns(google::protobuf::io::CodedInputStream*, unsigned int, bool (*)(int), google::protobuf::UnknownFieldSet*, google::protobuf::RepeatedField<int>*)’未定義的引用
/data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so:對‘google::protobuf::io::CodedInputStream::ReadVarint32Fallback(unsigned int)’未定義的引用
/data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so:對‘google::protobuf::io::CodedOutputStream::WriteVarint32SlowPath(unsigned int)’未定義的引用
添加link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/protobuf)就可以了。
# caffe
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/caffe_8)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/cuda_8)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/protobuf)
總結:
調用由一個caffe封裝好的一個識別的api,只需要提供這個識別api和.so文件,然后其他庫只需要提供so不需要提供頭文件。opencv因為需要用還是需要提供頭文件。
比如我這里只用到了caffe,但是編譯caffe又依賴cuda,protobuf等,一開始不加相應庫會報相應的問題。這個時候只需要添加庫的搜索路徑就可以了。頭文件不需要,因為已經編譯到庫里面了。
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/cuda_8)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/protobuf)
所以,我最后的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(yzm_test)
SET(CMAKE_BUILD_TYPE "Debug")
include_directories(${CMAKE_SOURCE_DIR}/3rdparty/opencv-3.4.10/include)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/opencv-3.4.10/lib)
# caffe
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/caffe_8)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/cuda_8)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/others/protobuf)
set(INC_DIR ${CMAKE_SOURCE_DIR}/api)
set(LINK_DIR ${CMAKE_SOURCE_DIR}/lib)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})
add_executable(yzm_test main.cpp)
target_link_libraries(yzm_test yanzhengma_chejian opencv_core opencv_imgproc opencv_imgcodecs opencv_highgui opencv_ml opencv_video opencv_videoio)
target_link_libraries(yzm_test caffe)
set_property(TARGET yzm_test PROPERTY CXX_STANDARD 11)
我把原本的opencv3.4.10庫換成了opencv3.2.0庫。報錯如下:
====================[ Build | all | Debug ]=====================================
/home/yhl/software/clion-2018.3.4/bin/cmake/linux/bin/cmake --build /data_1/everyday/1028/yzm/cmake-build-debug --target all -- -j 4
[ 50%] Building CXX object CMakeFiles/yzm_test.dir/main.cpp.o
[100%] Linking CXX executable yzm_test
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by /data_1/everyday/1028/yzm/lib/libyanzhengma_chejian.so, may conflict with libopencv_core.so.3.2
/usr/bin/ld: warning: libopencv_imgproc.so.3.4, needed by /data_1/everyday/1028/yzm/lib/libyanzhengma_chejian.so, may conflict with libopencv_imgproc.so.3.2
/usr/bin/ld: warning: libopencv_videoio.so.3.4, needed by /data_1/everyday/1028/yzm/lib/libyanzhengma_chejian.so, may conflict with libopencv_videoio.so.3.2
/usr/bin/ld: warning: libopencv_highgui.so.3.4, needed by /data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libopencv_imgcodecs.so.3.4, needed by /data_1/everyday/1028/yzm/3rdparty/others/caffe_8/libcaffe.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libpng16.so.16, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicui18n.so.58, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicuuc.so.58, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicudata.so.58, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_interlace_handling@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_image_width@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_IHDR@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_io_ptr@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_longjmp_fn@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_bgr@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_PLTE@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_x_pixels_per_meter@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_getTimeZoneDisplayName_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_read_row@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_setSubstChars_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_tRNS@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_error_fn@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_packing@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_clone_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_read_end@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_create_write_struct@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_write_fn@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_error@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucol_strcoll_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_strip_16@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_oFFs@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucol_open_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_compression_level@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_text@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_gAMA@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_filler@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_open_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘uenum_close_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_countAliases_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucol_close_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucol_getSortKey_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_read_update_info@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_write_image@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_gamma@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_get_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘uenum_next_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_read_info@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_toUnicode_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘u_errorName_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_getAlias_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_gray_to_rgb@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_inDaylightTime_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_valid@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_write_rows@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_sig_bytes@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘u_strToLower_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_write_chunk@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_getStandardName_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_pHYs@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘u_strToUpper_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_destroy_read_struct@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_option@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_getMaxCharSize_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_fromUnicode_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_open_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_getDefaultName_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_getDefaultTimeZone_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_read_fn@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_write_end@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_invert_mono@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_getDSTSavings_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_tRNS@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_destroy_write_struct@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_packswap@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_text@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_create_read_struct@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_close_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_countAvailable_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_openCountryTimeZones_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_compareNames_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_PLTE@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucnv_getAvailableName_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_openTimeZoneIDEnumeration_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_close_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_openTimeZones_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucol_setAttribute_58’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_IHDR@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_expand@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_write_info@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_oFFs@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_create_info_struct@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_y_pixels_per_meter@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_image_height@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_read_image@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_get_channels@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Gui.so.5:對‘png_set_gAMA@PNG16_0’未定義的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:對‘ucal_setMillis_58’未定義的引用
collect2: error: ld returned 1 exit status
CMakeFiles/yzm_test.dir/build.make:83: recipe for target 'yzm_test' failed
make[2]: *** [yzm_test] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/yzm_test.dir/all' failed
make[1]: *** [CMakeFiles/yzm_test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
例子1 源碼編譯opencv,報錯 libopencv_imgcodecs.so.3.2.0:對‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定義的引用
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/data_1/everyday/1028/opencv-3.2.0/my_install -D INSTALL_PYTHON_EXAMPLES=OFF -D INSTALL_C_EXAMPLES=OFF -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_GTK=ON -D WITH_OPENGL=ON -D BUILD_EXAMPLES=ON -D WITH_CUDA=OFF -D WITH_MATLAB=OFF ..
[ 25%] Building CXX object modules/ts/CMakeFiles/opencv_ts.dir/src/cuda_test.cpp.o
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFReadDirectory@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFWriteEncodedStrip@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFIsTiled@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFWriteScanline@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFGetField@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFNumberOfStrips@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFScanlineSize@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFReadEncodedTile@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFReadRGBATile@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFClose@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFRGBAImageOK@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘T 缺的庫都會在/usIFFOpen@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFReadEncodedStrip@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFSetField@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFSetWarningHandler@LIBTIFF_4.0’未定義的引用
../../lib/libopencv_imgcodecs.so.3.2.0:對‘TIFFSetErrorHandler@LIBTIFF_4.0’未定義的引用
collect2: error: ld returned 1 exit status
apps/annotation/CMakeFiles/opencv_annotation.dir/build.make:104: recipe for target 'bin/opencv_annotation' failed
make[2]: *** [bin/opencv_annotation] Error 1
CMakeFiles/Makefile2:3924: recipe for target 'apps/annotation/CMakeFiles/opencv_annotation.dir/all' failed
make[1]: *** [apps/annotation/CMakeFiles/opencv_annotation.dir/all] Error 2
make[1]: *** 正在等待未完成的任務....
這個錯誤網上很多,仔細看報錯,什么tiff4版本的。然后
ldd libopencv_imgcodecs.so.3.2.0
會出來:
linux-vdso.so.1 => (0x00007ffd3ec99000)
libopencv_imgproc.so.3.2 => /data_1/everyday/1028/opencv-3.2.0/build/lib/libopencv_imgproc.so.3.2 (0x00007f08a0082000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f089fe65000)
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f089fc0c000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f089f9e7000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f089f772000)
libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007f089f51c000)
libopencv_core.so.3.2 => /data_1/everyday/1028/opencv-3.2.0/build/lib/libopencv_core.so.3.2 (0x00007f089e79b000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f089e581000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f089e247000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f089df3e000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f089dd28000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f089d95e000)
libtbb.so.2 => /usr/lib/x86_64-linux-gnu/libtbb.so.2 (0x00007f089d721000)
/lib64/ld-linux-x86-64.so.2 (0x00007f08a1d7d000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f089d4ff000)
libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007f089d2f1000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f089d0ed000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f089cee5000)
libGL.so.1 => /usr/lib/nvidia-440/libGL.so.1 (0x00007f089cc3c000)
libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f089aba8000)
libGLX.so.0 => /usr/lib/nvidia-440/libGLX.so.0 (0x00007f089a978000)
libGLdispatch.so.0 => /usr/lib/nvidia-440/libGLdispatch.so.0 (0x00007f089a6a5000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f089a37a000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f089a040000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f0899e2e000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f0899bef000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f08999cd000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f08997c9000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f08995c3000)
可以看到libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f089f772000) 這里是5版本的。我是凌亂了到底需要多少!?
網上有人說把anchonda注釋掉,再重新打開一個終端編譯就可以。我試了我這邊不好使。
locate libtiff.so
出來一大堆庫,但是沒有看到4版本的。
這里有人解釋,https://github.com/BVLC/caffe/issues/1559
I'm looking at a similar problem, and thought I'd chime in.
There is no libtiff5. libtiff.so.5 is the libtiff 4.X ABI. They had to jump an ABI number because of a mistake in an earlier version.
I'm seeing this exact same problem; Cmake is building against the system libtiff.so.5, but is linking against anaconda's libtiff.so.5. The ABI versions aren't that different, but the symbols in the system version include a suffix of @@LIBTIFF_4.0, and the anaconda version doesn't.
這個解釋好像是對的。可能原本應該鏈接系統下面的libtiff.so.5,但是先在conda下面找到了這個庫就用它了,由於兩個庫有點兒差異導致的。
我注釋了conda但是報另外的錯誤,什么qt。可能用到了conda下面的庫。然后,又在網上找到了一個法子,就是在編譯選項中加這個:
-D BUILD_TIFF=ON
這個意思就是說源碼編譯tiff這個庫!恩,可以查看opencv目錄下面的3rdparty自帶了這個庫的源碼,可以用來源碼編譯。
恩,加上這句話確實可以了。
例子2 之前編譯caffe的時候也會報這個錯誤 對‘TIFFWriteEncodedStrip@LIBTIFF_4.0’未定義的引用
https://www.cnblogs.com/yanghailin/p/11255346.html#5-cmakelist-編譯caffe報錯
另外網友的例子:
網上人家編譯caffe也報這個錯,解決辦法就是重新編譯opencv和caffe,確保都是用的同一個地方的libtiff.so庫。
https://github.com/BVLC/caffe/issues/1559
I solved the problem by manually compiling libtiff and setting CMAKE_PREFIX_PATH, which makes caffe and opencv link to the same libtiff. I think this is a better way without side effects.
The error of undefined reference to TIFFxxxxxx comes from the following fact:
Opencv links to the libtiff found by cmake. By default, cmake only searches on the standard library path, e.g., /usr/local/lib/, by find_package() in /usr/local/share/cmake-xx/Modules/FindTIFF.cmake. If libtiff was not found there, opencv will compile it on the fly from its distribution /path/to/opencv_source_code/3rdparty/libtiff/.
While, caffe links to the libtiff pre-compiled by anaconda, located in $HOME/anaconda3/lib/
So, caffe and opencv link to different versions of libtiff.
solution
The way is to make opencv and caffe link to the same libtiff.
Step 1: manually compile the libtiff
wget http://download.osgeo.org/libtiff/tiff-4.0.10.tar.gz
tar -zxvf tiff-4.0.10.tar.gz && cd tiff-4.0.10
./configure --prefix=/path/to/libtiff/
make
make install (**Note**: no `sudo` since most people have no `root` privilege)
This will install libtiff into /path/to/libtiff/ in your home directory.
Step 2: recompile opencv with the newly installed libtiff
cd /path/to/opencv_source_code/
mkdir release && cd release
cmake -DCMAKE_PREFIX_PATH=/path/to/libtiff/ -DBUILD_LIST=core,highgui,improc,python3 -DCMAKE_INSTALL_PREFIX=$(python -c "import sys; print(sys.prefix)") -DPYTHON3_EXECUTABLE=$(which python) -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
(you can choose other modules)
make
make install (**Note**: no `sudo`)
The critical in step 2 is that set CMAKE_PREFIX_PATH to force cmake to follow the newly installed libtiff.
PYTHON3_EXECUTABLE, PYTHON3_INCLUDE_DIR, and PYTHON3_PACKAGES_PATH point to the anaconda python.
I only choose four modules of opencv, core,highgui,improc,python3, by setting BUILD_LIST, which is enough for caffe.
Step 3: recompile caffe with the newly installed libtiff
cd /path/to/caffe
vim Makefile.config
In Makefile.config, modify:
INCLUDE_DIRS := /path/to/libtiff/include $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := /path/to/libtiff/lib $(PYTHON_LIB) /usr/local/lib /usr/lib
This will force caffe to use the newly installed libtiff. Then,
make all
例子3 libpng16so16:對inflatevalidatezlib_129未定義的引用
例子4 /data_1/3rdparty/caffe/include/caffe/util/device_alternate.hpp:34:23: fatal error: cublas_v2.h: 沒有那個文件或目錄
敲命令
locate cublas_v2.h
會出來 /usr/local/cuda-8.0/include/cublas_v2.h
然后在cmakelist里面添加這兩句話:
include_directories(/usr/local/cuda-8.0/include/)
link_directories(/usr/local/cuda/lib64)
include_directories 是包含頭文件
link_directories是包含庫
例子5 not found libopencv_highgui.so:對‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定義的引用
https://www.cnblogs.com/yanghailin/p/11255346.html#6-報錯解決
/usr/bin/ld: warning: libjpeg.so.9, needed by //usr/local/lib/libuvc.so, not found (try using -rpath or -rpath-link)
libopencv_highgui.so:對‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定義的引用
例子6 一個可執行文件包換到另外一個平台跑, 提示缺庫問題
新服務器如何測試:
一般情況下我會拿一個最新的算法發版的壓縮包,如:project.tar.gz 。
服務器一般會提前裝好驅動(寒武紀或英偉達或者其他)
把壓縮包解壓之后。
把對應發版服務器(新服務器是英偉達,就從英偉達機器上拷貝, 寒武紀就從寒武紀上拷貝)上的發版目錄下的可執行程序project_1拷貝到/bin 目錄下。
cd bin
source ../scripts/project_env.sh (加載指定庫路徑的環境變量)
./project -alsologtostderr 1 即可進行標准測試。
ps : 一般情況下之前適配過的服務器,軟件部自己就可以取壓縮包進行系統測試。
也就是算法自己要去測試一台新服務器的時候,需要用上述操作進行測試。
可能在project_1 執行時候會缺庫啥的,或者報 xxx symbol not found in libxxx.so。
如果直接說缺庫, 那就去對應的服務器(寒武紀就是70.217, 英偉達就是70.209)上locate找。 或者用find 去/usr目錄下找。 一般情況下 缺的庫都會在/usr目錄下。
“xxx symbol not found in libxxx.so” 這個說明libxxx.so 與 新服務器的系統不匹配, 那么就先找下新服務器系統/usr下面有沒有libxxx.so ,有的話就直接用新服務器自帶的。 如果沒有的話,就比較麻煩,需要根據實際情況處理, 一般來說,如果沒有找到, 那么就需要確認xxx實際到底在那個庫中,然后再從對應服務器上找到那個庫,拷貝到新服務器上。
如何定位xxx , 用grep -r 去找(路徑一般是3rdparty下,然后就是/usr下), 然后strings 這個命令也可以確認找的對不對(具體用法自己查下。)
然后找到的庫如何指定, 加入你把找的庫放在了3rdlib/new_lib 目錄下,那就使用export LD_LIBRARY_PATH=3rdlib/new_lib:$LD_LIBRARY_PATH
3rdlib/new_lib 只是一個示例,最終使用更建議用絕對路徑,不容易出錯。