Mam strukturę zdefiniowaną w /usr/src/linux-3.2/include/linux/unistd.h
jądra Linux:
#ifndef _LINUX_UNISTD_H_
#define _LINUX_UNISTD_H_
struct threadinfo_struct {
int pid;
int nthreads;
int *tid;
};
/*
* Include machine specific syscall numbers
*/
#include <asm/unistd.h>
#endif /* _LINUX_UNISTD_H_ */
Po skompilowaniu i zainstalowaniu jądra, a następnie uruchomieniu go z niego, próbuję skompilować i uruchomić ten program:
#include <stdio.h>
#include <linux/unistd.h>
int main(void) {
struct threadinfo_struct *ti = (struct threadinfo_struct*) malloc(sizeof(struct threadinfo_struct));
// ...
return 0;
}
Jednak gdy próbuję to zrobić, pojawia się błąd w kompilacji programu:
test.c: In function "main":
test.c:4:78: error: invalid application of "sizeof" to incomplete type "struct threadinfo_struct"
Dlaczego dostaję ten błąd i jak go rozwiązać? Trudno mi znaleźć wiele informacji, biorąc pod uwagę, że jestem nowy w jądrze Linuksa.
Odpowiedzi:
1 dla odpowiedzi № 1Plik /usr/src/linux-3.2/include/linux/unistd.h
nie jest na standardowej ścieżce dołączania.
Aplikacje w przestrzeni użytkownika mają własne środowisko kompilacji. Dołączasz plik, który znajduje się w /usr/include/linux/unistd.h
. Większość wewnętrznych struktur jądra nie jest zdefiniowanych dla aplikacji w przestrzeni użytkownika.
Jeśli naprawdę potrzebujesz zdefiniować tę strukturę, musisz skopiować plik z drzewa linux do katalogu projektu lub dostosować polecenie gcc, dodając -isystem/usr/src/linux-3.2/include/
opcja.
Jednak ten drugi stworzy wielki bałagan, więc lepiej po prostu skopiuj plik.