我不清楚gcc
和c
。在我的/home/pi/Desktop/intern/adis16227_generic
目录中,我有5个文件。
ADIS16227.c
ADIS16227.h
Communication.c
Communication.h
main.c
的main.c
#include<stdio.h>
#include "Communication.h" // Communication definitions.
int main() {
printf("hello!!\n");
unsigned char status = 0;
status = SPI_Init(0, 1000000, 1, 1);
printf("%u", status);
return 0;
}
运行命令:
$ sudo gcc -L /home/pi/Desktop/intern/adis16227_generic main.c -lCommunication
错误:
/usr/bin/ld: cannot find -lCommunication
collect2: error: ld returned 1 exit status
问题:
我在这里缺少什么?
运行代码需要什么?
答案 0 :(得分:3)
-l
适用于图书馆,您从未使用Communication.c
建立图书馆。最简单的解决方案是将Communication.c
添加到编译器命令行。
对于较大的项目,请使用-c
开关单独编译每个翻译单元,如下所示:
gcc -c -Wall -Wextra -pedantic -omain.o main.c
gcc -c -Wall -Wextra -pedantic -oCommunication.o Communication.c
依旧......(作为建议,我在这里添加了一些常见的警告选项,它们可以帮助您发现错误)
生成的.o
文件是目标代码。这已经编译过机器代码,但链接器需要使用元信息将其与其他目标代码链接成一个完整的可执行文件。
然后用一个命令将它们全部链接:
gcc -oprogram main.o Communication.o
如果您实际上想要来自 - { - 1}}和Communication.c
的库,则可以将它们编译为目标代码:< / p>
ADIS16227.c
然后使用gcc -c -Wall -Wextra -pedantic -oCommunication.o Communication.c
gcc -c -Wall -Wextra -pedantic --oADIS16227.o ADIS16227.c
从中创建静态库:
ar
然后您的初始编译器命令将起作用(使用ar rcs libCommunication.a Communication.o ADIS16227.o
开关)。
最后一条建议:从不以root身份编译。这完全没必要。因此,请在此处删除-lCommunication
。
答案 1 :(得分:1)
这些选项:
sudo
建议链接器在-L /home/pi/Desktop/intern/adis16227_generic -lCommunication
目录中找到libCommunication.a
(或.so
)。
但是这个目录中只有来源。链接器不会构建您的&#34;通信&#34;的来源。图书馆给你。
所以你可以构建库并与之链接:
/home/pi/Desktop/intern/adis16227_generic
但也许是最快的&amp;实现成功构建的最快方法是:
gcc -c ADIS16227.c Communication.c
ar r libCommunication.a ADIS16227.o Communication.o
因此它将目录的所有文件编译为名为sudo gcc -o main *.c
当然,它会使编译时间更长,但也许它并不明显。
答案 2 :(得分:1)
首先进入/home/pi/Desktop/intern/adis16227_generic
目录:
cd /home/pi/Desktop/intern/adis16227_generic
然后,编译源:
gcc ADIS16227.c Communication.c main.c -I .
您现在可以运行已编译的程序(默认情况下调用a.out
):
./a.out
答案 3 :(得分:1)
您必须编译分开的文件,然后使用相关的obj文件编译main。
gcc -c Communication.c Communication.h
gcc main.c Communication.o -o main