未定义的引用,即使 .so 文件有它们

问题描述 投票:0回答:1

我的 C++ 项目使用头文件形式的库和一个共享对象。当我尝试构建它时,我得到了这个:

FAILED: insta360 
: && /usr/bin/c++ -g  CMakeFiles/insta360.dir/main.cpp.o -o insta360  /usr/lib/libCameraSDK.so && :
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_device_get_devnode'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_monitor_enable_receiving'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_device_new_from_syspath'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_device_unref'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_monitor_new_from_netlink'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_device_get_sysname'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_enumerate_get_list_entry'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_monitor_unref'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_enumerate_add_match_subsystem'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_monitor_filter_add_match_subsystem_devtype'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_monitor_receive_device'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_enumerate_scan_devices'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_monitor_get_fd'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_unref'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_device_get_action'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_list_entry_get_name'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_enumerate_new'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_list_entry_get_next'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_new'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_enumerate_unref'
/usr/bin/ld: /usr/lib/libCameraSDK.so: undefined reference to `udev_enumerate_add_match_property'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

但是当我跑步

nm -D /usr/lib/libCameraSDK.so | grep udev
我得到

             U udev_device_get_action
             U udev_device_get_devnode
             U udev_device_get_sysname
             U udev_device_new_from_syspath
             U udev_device_unref
             U udev_enumerate_add_match_property
             U udev_enumerate_add_match_subsystem
             U udev_enumerate_get_list_entry
             U udev_enumerate_new
             U udev_enumerate_scan_devices
             U udev_enumerate_unref
             U udev_list_entry_get_name
             U udev_list_entry_get_next
             U udev_monitor_enable_receiving
             U udev_monitor_filter_add_match_subsystem_devtype
             U udev_monitor_get_fd
             U udev_monitor_new_from_netlink
             U udev_monitor_receive_device
             U udev_monitor_unref
             U udev_new
             U udev_unref

所以功能都存在并且.so文件被正确导入。我的头文件在

/usr/include
中,我不知道会出什么问题,因为我自己设置 C++ 项目的经验不多,只是修改了它们。 提前致谢。

c++ cmake shared-libraries
1个回答
0
投票

U
表示符号未定义,而不是它存在。

也许您需要链接到其他一些库。由于所有函数都以

udev
开头,因此可以合理地假设它们属于某个处理名为“udev”的东西的库。也许,只是也许,那个库叫做“libudev”?

© www.soinside.com 2019 - 2024. All rights reserved.