在 OpenWRT 上针对 gpsd 进行编译 - 链接失败
Compiling against gpsd on OpenWRT - linking fails
我正在尝试编译一个使用 gps.h
的工具,但我的编译似乎每次都在尝试 link 到 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
非常感谢您的帮助。
您的 link 命令行包含“-static”,它可以防止 linking 针对 *.so 共享库(也称为共享对象,因此 'so'),但仍然允许 linking 反对 *.a static-link 图书馆(又名档案)。
参见:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
在您列出的目录中,link 命令行指向使用“-L”标志的目录中,有一个共享对象 libgps.so,但没有静态对象-link 图书馆 libgps.a .
这让 linker 无法满足对 libgps 的 link 时间依赖。满足它的唯一方法是使用 libgps.so,已使用“-static”禁用。
要修复,可以:
- 修改工具的编译配方,从link命令行中删除'-static',以启用共享对象,或
- 修改 gpsd 的编译配方,以便生成静态 link 库 libgps.a,作为 libgps.so 的补充或替代 libgps.so。
我正在尝试编译一个使用 gps.h
的工具,但我的编译似乎每次都在尝试 link 到 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
非常感谢您的帮助。
您的 link 命令行包含“-static”,它可以防止 linking 针对 *.so 共享库(也称为共享对象,因此 'so'),但仍然允许 linking 反对 *.a static-link 图书馆(又名档案)。 参见:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
在您列出的目录中,link 命令行指向使用“-L”标志的目录中,有一个共享对象 libgps.so,但没有静态对象-link 图书馆 libgps.a .
这让 linker 无法满足对 libgps 的 link 时间依赖。满足它的唯一方法是使用 libgps.so,已使用“-static”禁用。
要修复,可以:
- 修改工具的编译配方,从link命令行中删除'-static',以启用共享对象,或
- 修改 gpsd 的编译配方,以便生成静态 link 库 libgps.a,作为 libgps.so 的补充或替代 libgps.so。