android - Android.mk 中 prebuilt_static_libraries 顺序的链接是否敏感?

标签 android opencv android-ndk ros

下面的文件基本上是从我从 ROS 网站获得的脚本自动生成的,除了它我修改了一些与 opencv 相关的包,以便它们可以适合我的 ROS 项目。使用 Ctrl-F + "opencv"你可以在变量 "STLibs"中找到这些名字。

当我使用 NDK 将 opencv-3.3.1 链接到开源 ROS 项目时,会发生错误。我从 opencv 静态库中得到了许多“ undefined reference ”错误,但那些引用的函数应该打包在其他 opencv .a 文件中,对吗?

所以我想知道...... Android.mk 中这些 prebuilt_static_libraries 的顺序是否重要?如果是这样,任何人都可以帮助我吗?

/path/to/the/file/ros-android-ndk中的相关Android.mk:

    LOCAL_PATH := $(call my-dir)

    # These must go in some sort of order like include flags, otherwise they are dropped
    # Oh no, need to automate this with catkin somehow....
    stlibs := roscpp boost_signals boost_filesystem rosconsole \
rosconsole_print rosconsole_backend_interface boost_regex xmlrpcpp \
roscpp_serialization rostime boost_date_time cpp_common boost_system \
boost_thread console_bridge move_base rotate_recovery global_planner \
navfn layers boost_iostreams qhullstatic flann_cpp_s flann_cpp_s-gd \
nodeletlib bondcpp uuid rosbag rosbag_storage roslz4 lz4 topic_tools \
voxel_grid tf tf2_ros actionlib tf2 move_slow_and_clear \
dwa_local_planner clear_costmap_recovery carrot_planner \
base_local_planner trajectory_planner_ros urdfdom_sensor \
urdfdom_model_state urdfdom_model urdfdom_world rosconsole_bridge \
pointcloud_filters laser_scan_filters mean params increment median \
transfer_function compressed_image_transport cv_bridge image_transport \
compressed_depth_image_transport amcl_sensors amcl_map amcl_pf \
stereo_image_proc image_proc image_geometry ***opencv_imgproc \
opencv_core opencv_flann opencv_highgui opencv_features2d opencv_ml \
opencv_imgcodecs opencv_calib3d opencv_video opencv_objdetect \
opencv_photo opencv_videostab opencv_superres opencv_stitching \
opencv_dnn opencv_shape opencv_videoio*** cpufeatures IlmImf libjasper \
libjpeg libpng libprotobuf libtiff libwebp tbb tegra_hal polled_camera \
camera_info_manager collada_parser geometric_shapes octomap octomath \
shape_tools random_numbers camera_calibration_parsers costmap_2d \
laser_geometry message_filters resource_retriever \
dynamic_reconfigure_config_init_mutex tinyxml class_loader \
PocoFoundation roslib rospack boost_program_options pcl_ros_filters \
pcl_ros_io pcl_ros_tf pcl_common pcl_octree pcl_kdtree pcl_search \
pcl_sample_consensus pcl_filters pcl_io pcl_features pcl_registration \
pcl_keypoints pcl_ml pcl_segmentation pcl_stereo pcl_tracking \
pcl_recognition pcl_surface pluginlib pluginlib_tutorials \
image_transport_plugins nodelet_math yaml-cpp 

    #shlibs :=

    define include_shlib
    $(eval include $$(CLEAR_VARS))
    $(eval LOCAL_MODULE := $(1))
    $(eval LOCAL_SRC_FILES := $$(LOCAL_PATH)/lib/lib$(1).so)
    $(eval include $$(PREBUILT_SHARED_LIBRARY))
    endef
    define include_stlib
    $(eval include $$(CLEAR_VARS))
    $(eval LOCAL_MODULE := $(1))
    $(eval LOCAL_SRC_FILES := $$(LOCAL_PATH)/lib/lib$(1).a)
    $(eval include $$(PREBUILT_STATIC_LIBRARY))
    endef

    #$(foreach shlib,$(shlibs),$(eval $(call include_shlib,$(shlib))))
    $(foreach stlib,$(stlibs),$(eval $(call include_stlib,$(stlib))))

    include $(CLEAR_VARS)
    LOCAL_MODULE    := roscpp_android_ndk
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
    LOCAL_EXPORT_CPPFLAGS := -fexceptions -frtti
    #LOCAL_SRC_FILES := dummy.cpp
    LOCAL_EXPORT_LDLIBS := $(foreach l,$(shlibs),-l$(l)) -L$(LOCAL_PATH)/lib
    #LOCAL_EXPORT_LDLIBS := -lstdc++ #-L$(LOCAL_PATH)/lib
    #LOCAL_SHARED_LIBRARIES := $(shlibs)
    LOCAL_STATIC_LIBRARIES := $(stlibs) gnustl_static

    include $(BUILD_STATIC_LIBRARY)

错误信息如下,
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function icvGetRectangles(CvMat const*, CvMat const*, CvMat const*, CvMat const*, CvSize, cv::Rect_<float>&, cv::Rect_<float>&): error: undefined reference to 'cvUndistortPoints'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function cvRodrigues2: error: undefined reference to 'cv::checkRange(cv::_InputArray const&, bool, cv::Point_<int>*, double, double)'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function cvFindExtrinsicCameraParams2: error: undefined reference to 'cvUndistortPoints'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function cvFindExtrinsicCameraParams2: error: undefined reference to 'cvCheckArr'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function cvStereoRectify: error: undefined reference to 'cvUndistortPoints'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function cv::rectify3Collinear(cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::Size_<int>, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, double, cv::Size_<int>, cv::Rect_<int>*, cv::Rect_<int>*, int): error: undefined reference to 'cv::undistortPoints(cv::_InputArray const&, cv::_OutputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&)'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(calibration.cpp.o):calibration.cpp:function cv::rectify3Collinear(cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::Size_<int>, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, double, cv::Size_<int>, cv::Rect_<int>*, cv::Rect_<int>*, int): error: undefined reference to 'cv::undistortPoints(cv::_InputArray const&, cv::_OutputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&)'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:function cv::PointSetRegistrator::~PointSetRegistrator(): error: undefined reference to 'cv::Algorithm::~Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:function cv::PointSetRegistrator::~PointSetRegistrator(): error: undefined reference to 'cv::Algorithm::~Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:function cv::LMeDSPointSetRegistrator::~LMeDSPointSetRegistrator(): error: undefined reference to 'cv::Algorithm::~Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:function cv::LMeDSPointSetRegistrator::~LMeDSPointSetRegistrator(): error: undefined reference to 'cv::Algorithm::~Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:function cv::createRANSACPointSetRegistrator(cv::Ptr<cv::PointSetRegistrator::Callback> const&, int, double, double, int): error: undefined reference to 'cv::Algorithm::Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:function cv::createLMeDSPointSetRegistrator(cv::Ptr<cv::PointSetRegistrator::Callback> const&, int, double, int): error: undefined reference to 'cv::Algorithm::Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:typeinfo for cv::PointSetRegistrator: error: undefined reference to 'typeinfo for cv::Algorithm'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:vtable for cv::PointSetRegistrator: error: undefined reference to 'cv::Algorithm::save(cv::String const&) const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:vtable for cv::PointSetRegistrator: error: undefined reference to 'cv::Algorithm::getDefaultName() const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:vtable for cv::RANSACPointSetRegistrator: error: undefined reference to 'cv::Algorithm::save(cv::String const&) const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:vtable for cv::RANSACPointSetRegistrator: error: undefined reference to 'cv::Algorithm::getDefaultName() const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:vtable for cv::LMeDSPointSetRegistrator: error: undefined reference to 'cv::Algorithm::save(cv::String const&) const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(ptsetreg.cpp.o):ptsetreg.cpp:vtable for cv::LMeDSPointSetRegistrator: error: undefined reference to 'cv::Algorithm::getDefaultName() const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(solvepnp.cpp.o):solvepnp.cpp:function cv::solvePnP(cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, bool, int): error: undefined reference to 'cv::undistortPoints(cv::_InputArray const&, cv::_OutputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&)'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(solvepnp.cpp.o):solvepnp.cpp:function cv::solvePnP(cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, bool, int): error: undefined reference to 'cv::undistortPoints(cv::_InputArray const&, cv::_OutputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&)'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(levmarq.cpp.o):levmarq.cpp:function cv::createLMSolver(cv::Ptr<cv::LMSolver::Callback> const&, int): error: undefined reference to 'cv::Algorithm::Algorithm()'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(levmarq.cpp.o):levmarq.cpp:typeinfo for cv::LMSolver: error: undefined reference to 'typeinfo for cv::Algorithm'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(levmarq.cpp.o):levmarq.cpp:vtable for cv::LMSolver: error: undefined reference to 'cv::Algorithm::save(cv::String const&) const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(levmarq.cpp.o):levmarq.cpp:vtable for cv::LMSolver: error: undefined reference to 'cv::Algorithm::getDefaultName() const'
    /home/csx/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib/libopencv_calib3d.a(triangulate.cpp.o):triangulate.cpp:function cvCorrectMatches: error: undefined reference to 'cvSolvePoly'

最佳答案

是的,链接器的成功取决于静态库的顺序。见 https://github.com/android-ndk/ndk/issues/545以及那里的一些解决方法,例如

LOCAL_LDLIBS += -Wl,--start-group -L $(TARGET_OUT) $(foreach l,$(stlibs),-l $(l)) -Wl,--end-group
-l 之间的空格和 $(l)是有意的,否则NDK会提示。

关于android - Android.mk 中 prebuilt_static_libraries 顺序的链接是否敏感?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49380608/

相关文章:

android - 如何将 Android 中的 ARGB_8888 图像转换为 Native OpenCV 中的 Mat

C++ OpenCV : Iterate through pixels in a Mat which is ROI of another Mat

android - ndk 工具链不支持 type_alias 吗?

android - Android 的 ARM 汇编程序中对 'printf' 的 undefined reference

android - undefined reference 错误,无法创建共享库

android - 清理 Genymotion 虚拟设备本地缓存

android:即使应用程序关闭也能收到短信

opencv - 使用 gpu cuda 支持编译 opencv

java - 启动时的if语句

Android - 在运行时缩放 View 组(布局)