c - 错误:cannot find libary file when trying to link the library file

标签 c linker

我在 stackoverflow 中遇到了许多与将库链接到 c 文件相关的问题,我遵循了如下方法

注意:我的库文件与 .c 文件位于同一位置。

如何解决这些错误?

  1. 使用带扩展名的库名称

cc consoleDemo.c -L。 -lusbcan64.a

-L{包含库的文件的路径} -l${库名称} 以下是编译错误

/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lUSBCAN64.a
collect2: error: ld returned 1 exit status
  • 使用不带扩展名的库名称
  • cc consoleDemo.c -L。 -lusbcan64

    以下是编译错误

    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible ./libUSBCAN64.a when searching for -lUSBCAN64
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible ./libUSBCAN64.a when searching for -lUSBCAN64
    /tmp/ccTh3hGd.o:ConsoleDemo.c:(.text+0x2b9): undefined reference to `_kbhit'
    /tmp/ccTh3hGd.o:ConsoleDemo.c:(.text+0x2b9): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_kbhit'
    /tmp/ccTh3hGd.o:ConsoleDemo.c:(.text+0x2c6): undefined reference to `_getch'
    /tmp/ccTh3hGd.o:ConsoleDemo.c:(.text+0x2c6): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_getch'
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanInitHardware' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanDeinitHardware' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanGetModuleTime' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanInitCanEx2' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanResetCanEx' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanReadCanMsgEx' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanWriteCanMsgEx' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_UcanGetStatusEx' defined in .idata$5 section in /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b)
    /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/../../../../lib/USBCAN64.lib(USBCAN64.dll.b):(.text+0x2): additional relocation overflows omitted from the output
    collect2: error: ld returned 1 exit status
    

    最佳答案

    第一次尝试完全无效,因为 -l 标志和 .a 后缀不能同时指定。您的第二次尝试暴露了三种问题。

    1. libUSBCAN64.a 的不兼容版本(可能是针对错误的操作系统或 CPU)。这不是一个大问题,因为您最终找到了正确的版本,但这是一个烦人的警告。只需删除该文件即可。
    2. kbhit 和 getch 的 undefined symbol 。这些是 Microsoft 产品特有的非标准功能。您需要链接到 Microsoft 库(这可能有效,也可能无效),或者(更好)完全避免这些函数并使用标准 C。
    3. 截断的重定位。这可能意味着您的程序太大或者您使用了不适当的编译标志或内联汇编。 Google“重定位被截断以适合:R_X86_64_32”和/或针对此特定问题发布另一个问题以及完整的源代码和构建命令。

    关于c - 错误:cannot find libary file when trying to link the library file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45954652/

    相关文章:

    c - 如何在没有平台依赖性的情况下在 C 中复制文件?

    linux - 如何强制链接来自特定库的符号?

    c++ - 多重定义 C++

    c - 循环重复自己?

    c - Do...While Loop 不停地打印

    c - glTranslatef 放置问题

    c - GHashTable 是如何使用哈希值来存储它的节点的呢?

    linux - 使用 Linux 加载程序时 ldconfig 错误 :"is not a symbolic link"

    c++ - 链接器错误 C++ Visual Studio 2005

    python - 扩展 Python 时出现问题(链接错误)?