将库与 arm gcc 链接
Linking library with arm gcc
我的嵌入式 C 项目出现问题。
我正在尝试 link libcrc 到我的项目,但出现未定义的引用错误。
我试着将问题简化为最简单的形式,这就是我所拥有的:
#include "checksum.h"
int main(void)
{
char data[8];
short a = crc_modbus(data, 8);
while (1);
}
然后我运行这个命令:
arm-none-eabi-gcc -mcpu=arm7tdmi --specs=nosys.specs -I../../../libraries/libcrc/include -o main ../src/main.c -L../../../libraries/libcrc/lib -lcrc
我收到以下错误:
/var/folders/_8/_cw6l3nd335f_j6cn6z79m4m0000gn/T//ccL0dSgt.o: In function `main':
main.c:(.text+0x18): undefined reference to `crc_modbus'
collect2: error: ld returned 1 exit status
我了解了旗帜的顺序如何重要,但我试过该顺序但无济于事。
我也试过 运行以下方法:
gcc -I../../../libraries/libcrc/include ../src/main.c -lcrc -o main -L../../../libraries/libcrc/lib
我得到这个作为输出:
../src/main.c:5:24: warning: passing 'char [8]' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
short a = crc_modbus(data, 8);
^~~~
../../../libraries/libcrc/include/checksum.h:93:52: note: passing argument to parameter 'input_str' here
uint16_t crc_modbus( const unsigned char *input_str, size_t num_bytes );
^
1 warning generated.
因此,当我将与 arm-gcc 基本相同的命令传递给 gcc 时,它似乎起作用了。我在这里错过了什么?需要添加什么 arm gcc
从它适用于 gcc
但不适用于 arm-gcc
的评论来看,您似乎正在使用交叉编译器,并且正在为主机架构选择库目标体系结构的库。
当你使用crosscospiler时,你需要确保你的工具链环境设置正确,否则你会在构建时遇到很多问题。您还需要确保构建环境中可用的库是针对目标体系结构构建的。如果不是,链接器将找到用 -L
指定的库,但在库中将没有针对您的目标体系结构的符号,因此您会收到错误消息,指出您正在使用的符号来自该库。
我的嵌入式 C 项目出现问题。
我正在尝试 link libcrc 到我的项目,但出现未定义的引用错误。
我试着将问题简化为最简单的形式,这就是我所拥有的:
#include "checksum.h"
int main(void)
{
char data[8];
short a = crc_modbus(data, 8);
while (1);
}
然后我运行这个命令:
arm-none-eabi-gcc -mcpu=arm7tdmi --specs=nosys.specs -I../../../libraries/libcrc/include -o main ../src/main.c -L../../../libraries/libcrc/lib -lcrc
我收到以下错误:
/var/folders/_8/_cw6l3nd335f_j6cn6z79m4m0000gn/T//ccL0dSgt.o: In function `main':
main.c:(.text+0x18): undefined reference to `crc_modbus'
collect2: error: ld returned 1 exit status
我了解了旗帜的顺序如何重要,但我试过该顺序但无济于事。
我也试过 运行以下方法:
gcc -I../../../libraries/libcrc/include ../src/main.c -lcrc -o main -L../../../libraries/libcrc/lib
我得到这个作为输出:
../src/main.c:5:24: warning: passing 'char [8]' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
short a = crc_modbus(data, 8);
^~~~
../../../libraries/libcrc/include/checksum.h:93:52: note: passing argument to parameter 'input_str' here
uint16_t crc_modbus( const unsigned char *input_str, size_t num_bytes );
^
1 warning generated.
因此,当我将与 arm-gcc 基本相同的命令传递给 gcc 时,它似乎起作用了。我在这里错过了什么?需要添加什么 arm gcc
从它适用于 gcc
但不适用于 arm-gcc
的评论来看,您似乎正在使用交叉编译器,并且正在为主机架构选择库目标体系结构的库。
当你使用crosscospiler时,你需要确保你的工具链环境设置正确,否则你会在构建时遇到很多问题。您还需要确保构建环境中可用的库是针对目标体系结构构建的。如果不是,链接器将找到用 -L
指定的库,但在库中将没有针对您的目标体系结构的符号,因此您会收到错误消息,指出您正在使用的符号来自该库。