Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对已编译对象使用存档文件似乎破坏了编译_C++_C_Gcc5 - Fatal编程技术网

C++ 对已编译对象使用存档文件似乎破坏了编译

C++ 对已编译对象使用存档文件似乎破坏了编译,c++,c,gcc5,C++,C,Gcc5,我有一个很大的项目,有一个定制的Makefile来构建所有东西。这是一个手臂皮质-M0 其中一个步骤是将Newlibsyscalls.c编译成syscalls.c.o。它被转储到一个归档文件newlib.a,该文件又链接到最终的output.elf,以便加载到我的设备的闪存上 $ arm-none-eabi-gcc -o output.elf .bld/*.c.o .bld/*.cpp.o .bld/libs/*.a -nostartfiles -mcpu=cortex-m0 -mthumb -

我有一个很大的项目,有一个定制的Makefile来构建所有东西。这是一个手臂皮质-M0

其中一个步骤是将Newlib
syscalls.c
编译成
syscalls.c.o
。它被转储到一个归档文件
newlib.a
,该文件又链接到最终的
output.elf
,以便加载到我的设备的闪存上

$ arm-none-eabi-gcc -o output.elf .bld/*.c.o .bld/*.cpp.o .bld/libs/*.a -nostartfiles -mcpu=cortex-m0 -mthumb -Tlinker.ld -Wl,-Map=output.map --specs=nano.specs
如果我遵循上述步骤,有时“存档没有索引”:

有时(我还没有弄清楚如何决定性地实现一个或另一个),我会得到一个未定义的引用,即使
\u init()
syscalls.c
中定义为空函数

c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libc_nano.a(lib_a-init.o): In function `__libc_init_array':
init.c:(.text.__libc_init_array+0x1c): undefined reference to `_init'
但是,如果我跳过
newlib.a
文件,直接将
syscalls.c.o
链接到final
.elf
中,它就会正常工作

使用归档文件会导致此问题吗?我还尝试将参数重新排序到链接器,但没有成功

注释(编辑) 我注意到运行ranlib添加了一条指令。但是,这不适用,因为:

  • 这在我正在建立的其他档案上是不必要的,为什么这里需要它
  • 这个错误不再发生了(经过一些修改后,不知道发生了什么变化)。主要问题是
    \u init
    未定义

  • 参考文献
  • 我正在编译此版本中的其他存档文件,没有任何问题。这里的独特之处在于,此归档文件中只有一个文件,而且是唯一的C-only归档文件。然而,我不认为这会对事情产生什么影响

  • 这就是我编译
    syscalls.c
    和归档
    .o
    文件的基本方式:

    $ arm-none-eabi-gcc newlib/syscalls.c -o .bld/newlib/syscalls.c.o -c -std=gnu11 -Wstrict-prototypes -nostartfiles -mcpu=cortex-m0 -mthumb -O2 -pipe -ffreestanding -funsigned-bitfields -Wall -Wfatal-errors -ffunction-sections -fdata-sections -MMD -MP -MF .bld/.dep/newlib/syscalls.c.o.d
    $ arm-none-eabi-ar rcs .bld/libs/newlib.a .bld/newlib/syscalls.c.o
    
  • gcc
    version

    arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496]
    
  • 简化的
    syscalls.c

    caddr_t _sbrk(int nbytes) __attribute__((externally_visible));
    void _init(void) __attribute__((externally_visible));
    
    /* c++ destructor dynamic shared object needed if -fuse-cxa-atexit is used*/
    void *__dso_handle __attribute__ ((weak));
    
    // defined in linker script
    extern caddr_t Heap_Bank1_Start;
    extern caddr_t Heap_Bank1_End;
    
    caddr_t _sbrk(int nbytes) { /* ... */ }
    void _init(void) {}
    

  • 希望此提示可以帮助您:

    您好,您出现此错误是因为静态库(libmodbus.a)已被删除 为其他平台预编译。事实上,把它留在里面是我的错 存储库。为了解决此错误,您应该编译库 并将其替换到lib目录中


    希望此提示可以帮助您:

    您好,您出现此错误是因为静态库(libmodbus.a)已被删除 为其他平台预编译。事实上,把它留在里面是我的错 存储库。为了解决此错误,您应该编译库 并将其替换到lib目录中


    您是否运行了
    ranlib
    ?@BoundaryImposition可能是正确的,错误消息“存档没有索引;运行ranlib添加一个”会泄露它。您需要运行ranlibIt,这意味着存档没有索引;您可以运行ranlib来添加一个。为什么我需要在此存档上运行
    ranlib
    ,而不需要运行任何其他存档?您是否运行了
    ranlib
    ?@BoundaryImposition可能是对的,错误消息“存档没有索引;运行ranlib来添加一个”会泄露它。您需要运行ranlibIt,这意味着存档没有索引;您可以运行ranlib来添加一个。为什么我需要在此存档上运行
    ranlib
    ,而不需要任何其他存档?
    caddr_t _sbrk(int nbytes) __attribute__((externally_visible));
    void _init(void) __attribute__((externally_visible));
    
    /* c++ destructor dynamic shared object needed if -fuse-cxa-atexit is used*/
    void *__dso_handle __attribute__ ((weak));
    
    // defined in linker script
    extern caddr_t Heap_Bank1_Start;
    extern caddr_t Heap_Bank1_End;
    
    caddr_t _sbrk(int nbytes) { /* ... */ }
    void _init(void) {}