在 OpenWRT 上针对 gpsd 进行编译 - 链接失败

标签 c linker router openwrt gpsd

我正在尝试编译一个使用 gps.h 的工具,但每次尝试链接到 libgps 时,我的编译似乎都会失败。我收到的错误消息是:

/opt/openwrt-sdk/staging_dir/toolchain-arm_cortex-a9+vfpv3_gcc-7.3.0_musl_eabi/bin/../lib/gcc/arm-openwrt-linux-muslgnueabi/7.3.0/../../../../arm-openwrt-linux-muslgnueabi/bin/ld: cannot find -lgps

这是我正在编译的命令:

arm-openwrt-linux-gcc -o ./bin/eagle src/main.c -I./src -I/opt/openwrt-sdk/staging_dir/target-arm_cortex-a9+vfpv3_musl_eabi/usr/include -static -L/opt/openwrt-sdk/staging_dir/target-arm_cortex-a9+vfpv3_musl_eabi/usr/lib  -lpthread -lgps

引用基本代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <gps.h>

int main(void)
{
  int rc;
  struct gps_data_t gps_data;
  if ((rc = gps_open("localhost", "2947", &gps_data)) == -1)
  {
    printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
    return 1;
  }
  gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);

  return 0;
}

我的工具链中的一些目录列表 - 据我所知,libgps 已成功编译:

# ls -lah /opt/openwrt-sdk/staging_dir/target-arm_cortex-a9+vfpv3_musl_eabi/usr/include/ | grep gps

-rw-rw-r-- 1 root root  80K Sep  7  2017 gps.h

# ls -lah /opt/openwrt-sdk/staging_dir/target-arm_cortex-a9+vfpv3_musl_eabi/usr/lib/ | grep gps

lrwxrwxrwx 1 root root   16 Oct 17 18:46 libgps.so -> libgps.so.23.0.0
lrwxrwxrwx 1 root root   16 Oct 17 18:46 libgps.so.23 -> libgps.so.23.0.0
-rwxr-xr-x 1 root root 101K Oct 17 18:46 libgps.so.23.0.0

提前非常感谢您的帮助。

最佳答案

您的链接命令行包含“-static”,它可以防止链接到 *.so 共享库(也称为共享对象,因此为“so”),但仍然允许链接到 *.a 静态链接库(也称为存档)。 请参阅:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

在您列出的内容以及链接命令行使用“-L”标志指向的目录中,有一个共享对象 libgps.so,但没有静态链接库 libgps.a 。

这使得链接器无法满足对 libgps 的链接时依赖性。满足这个要求的唯一方法是使用 libgps.so,但已使用“-static”禁用。

要修复,请执行以下任一操作:

  1. 修改工具的编译配方,以便从链接命令行中删除“-static”,以便能够使用共享对象,或者
  2. 修改 gpsd 的编译配方,以便构建静态链接库 libgps.a,作为 libgps.so 的补充或替代。

关于在 OpenWRT 上针对 gpsd 进行编译 - 链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58445839/

相关文章:

c - 错误 : could not insert module. 模块中的未知符号

c - 使用 Arduino Mega 2560 - RS232 从条码扫描仪读取 Tx

c - STM32 SPI通信

node.js - 哪个方法等同于 Express.js 上的 url_for

c - "Read only"将驱动程序函数分配给 netdev_ops 函数指针时出错

ios - 添加 BurSTLySDK 和 TestFlightSDK 导致链接器错误

c++ - 找不到体系结构 x86_64 os x lion 的符号

visual-c++ - __NULL_IMPORT_DESCRIPTOR 有什么用(MSVC map 文件)?

javascript - 如何使用路由器在 HTML View 之间切换

linux - 路由会影响具有绑定(bind)源地址的套接字吗?