我很难将我的代码链接到Atmel库。

我的代码使用Atmel库中定义的功能GetTickCount()。我的cpp文件编译正常,但链接失败。该库在链接期间存在,并且实际上已在该过程中被另一个C文件使用。


我的文件I2C_due.cpp调用函数GetTickCount()。
函数getTickCount()存在于libsam_sam3x8e_gcc_rel.a库中(来自timetick.c)。这是Atmel的预构建文件。
文件connection.c(来自Arduino)是用我的文件编译的,也具有对GetTickCount()的调用,但是在链接之前将其放置在libFrameworkArduino.a中。


在链接期间,链接器不会抱怨从connection.c对GetTickCount()的调用,但是会抱怨我的文件。如果我从链接器命令行中删除了lib libsam_sam3x8e_gcc_rel.a,那么它当然也会抱怨wire.c调用。因此,我确定链接期间会使用lib(并且它在命令行末尾,因此链接器首先解析我的文件)。

我想知道两件事:


我在C ++方法中调用C函数。
与新的C可见性功能有关的内容。


GetTickCount()是在嵌入libsam_sam3x8e_gcc_rel.a的timetick.c内部定义的:

extern uint32_t GetTickCount( void )
{
    return _dwTickCount ;
}


timetick.h:

extern uint32_t GetTickCount( void ) ;


链接器命令行:

arm-none-eabi-g++ -o .pioenvs/due/firmware.elf -Os -mthumb -mcpu=cortex-m3 \
  -Wl,--gc-sections -Wl,--check-sections -Wl,--unresolved-symbols=report-all \
  -Wl,--warn-common -Wl,--warn-section-align -Wl,--entry=Reset_Handler -u _sbrk \
  -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit \
  -u kill -u _getpid -Wl,-T"flash.ld" (many objects).o \
  .pioenvs/due/src/Marlin/HAL/DUE/I2C_due.o (many objects).o -L(many lib dirs) \
  -Wl,--start-group .pioenvs/due/libFrameworkArduinoVariant.a \
  .pioenvs/due/libFrameworkArduino.a -lc -lgcc -lm -lsam_sam3x8e_gcc_rel \
  .pioenvs/due/lib/libWire.a .pioenvs/due/lib/libSPI.a -Wl,--end-group


错误:

/home/alex/(longdir)/HAL/DUE/I2C_due.cpp:239: undefined reference to `GetTickCount()'

...

.pioenvs/(longdir)/HAL/DUE/I2C_due.o:/home/alex/(longdir)/HAL/DUE/I2C_due.cpp:344: more undefined references to `GetTickCount()' follow


只需检查lib:

$ nm -s libsam_sam3x8e_gcc_rel.a | grep GetTickCount
GetTickCount in timetick.o
00000001 T GetTickCount


关于如何链接文件的任何提示?

干杯。

亚历克斯

最佳答案

分析R ..的评论,我发现了我的错误。

不允许在C ++函数内部调用C函数。
这就是我们在函数声明之前使用extern“ C”的原因。

我必须创建一个.c和.h文件,并在.h中使用extern“ C”。

teste.c:

uint32_t MiliS()
{
    return GetTickCount();
}


teste.h:

extern "C" uint32_t MiliS();


这样,我们可以从.cpp文件调用MiliS(),它将成为GetTickCount()的包装器

关于c++ - 嵌入式C/C++:现有符号的 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47371755/

10-11 23:51