错误:尝试链接库文件

时间:2017-08-30 07:40:20

标签: c linker

我在堆栈溢出中遇到了很多关于将库链接到c文件的问题,我按照以下方法进行了操作

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

如何解决这些错误?

  1. 使用扩展名为
  2. 的库名称

    cc consoleDemo.c -L。 -lusbcan64.a

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

    /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
    
    1. 使用不带扩展名的图书馆名称
    2. 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
      

1 个答案:

答案 0 :(得分:0)

第一次尝试只是作为-l标志无效,并且不能同时指定.a后缀。你的第二次尝试暴露了三种问题。

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