【发布时间】:2021-06-14 09:30:01
【问题描述】:
之前在 Raspberry Stackexchange 上发过,因离题而关闭,所以我来了。
下面的程序用gcc main.c -lpigpio -lpthread -Wall -Wextra 编译干净。我使用的是 gcc 8.3.0(交叉编译器或普通编译器不会改变任何东西)。
// main.c
#include <stdio.h>
#include <pigpio.h>
void listen() {
printf("hi from listen\n");
}
int main() {
gpioInitialise();
printf("hi from main\n");
gpioTerminate();
return 0;
}
没有警告,但程序会愉快地打印
hi from listen
hi from main
原因似乎是gpioInitialise() 试图从<sys/sockets.h> here 调用listen(2),而是从main.c 调用函数。当然,这不起作用并导致 pigpio 库中的错误消息:
xxxx-xx-xx xx:xx:xx pthSocketThread: setsockopt() fail, closing socket -1
xxxx-xx-xx xx:xx:xx pthSocketThread: accept failed (Bad file descriptor)
问题:为什么 gcc 链接一个具有完全不同签名的函数而不抛出任何错误?我知道static,但我想了解这一点并从中学习。肯定不会像listen(2) 不被声明为静态那么简单吧?
【问题讨论】:
-
与 C++ 不同,外部 C 库中没有函数原型签名信息。