Lỗi liên quan đến case-sensitive của tên file trong C
TIL
719
GCC
2
Compile
1
C
29
Linux
101
White

Phùng Văn Tú viết ngày 01/12/2016

Case-sensive khi biên dịch

Cấu trúc source ví dụ

Giả sử có source như này:

.
├── hello
├── hello.c
├── inc_lowercase
│   └── abc.h
└── inc_uppercase
    └── Abc.h

hello.c:

$ cat hello.c
#include<stdio.h>
#include"Abc.h"
#include"abc.h"

int main(int argc, char* argv[])
{
    abc_t var1;
    Abc_t var2;

    var1.x = 0;
    var2 = 3;

    printf("OMG Hello world %d %ld\n",var1.x, var2);
    return 0;
}

inc_lowercase/abc.h:

typedef struct _abc_
{
    int x;  
}abc_t;

*inc_uppercase/Abc.h:

typedef long int Abc_t;

2. So sánh thử

2.1 Thư mục source nằm trên home của VMWare

Kết quả: Build ngon, chạy tốt:

$ gcc -o hello hello.c -I./inc_uppercase -I./inc_lowercase
$ ./hello 
OMG Hello world 0 3

2.1 Thư mục source nằm trên thư mục chia sẻ giữa VMWare (chạy Linux) với Host (chạy Windows) thông qua vmhgfs:

Giả sử ta để source ở /mnt/hgfs :

Kết quả: Build lỗi, đương nhiên là không chạy được.

duser@192.168.70.225:/mnt/hgfs$ gcc -o hello hello.c -I./inc_uppercase -I./inc_lowercase
In file included from hello.c:3:0:
abc.h:1:16: error: redefinition of ‘struct _abc_’
 typedef struct _abc_
                ^
In file included from hello.c:2:0:
Abc.h:1:16: note: originally defined here
 typedef struct _abc_
                ^
In file included from hello.c:3:0:
abc.h:4:2: error: conflicting types for ‘abc_t’
 }abc_t;
  ^
In file included from hello.c:2:0:
Abc.h:4:2: note: previous declaration of ‘abc_t’ was here
 }abc_t;
  ^
hello.c: In function ‘main’:
hello.c:8:2: error: unknown type name ‘Abc_t’
  Abc_t var2;
  ^
hello.c:13:2: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘int’ [-Wformat=]
  printf("OMG Hello world %d %ld\n",var1.x, var2);
  ^

Ta thấy các lỗi ở đây khá là "lạ", nào là redefine, nào là unkown type name.
*Nếu gặp lỗi này lần đầu thì không phải ai cũng lý giải được. :( *

Vấn đề ở đây nằm ở /mnt/hgfs.
Có vẻ như hgfs không phân biệt Abc.h với abc.h nên khi GCC (dù chạy trên VM Ubuntu) đọc cái file này lên sẽ cùng 1 tên.

Ở đây ta thấy lỗi typedef struct _abc thì có thể đoán được rằng abc.h đã được include trước.
Có vẻ như hgfs coi 2 file header trên với cùng 1 tên abc.h.

Không chỉ có hgfs mà nhiều hệ thống file khác cũng giống như thế.

doime 30-11-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Phùng Văn Tú

13 bài viết.
96 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
31 8
Chúng ta thường nghe nhiều đến Unicode, UTF8, UTF16, hay ShiftJS. Trong bài này chỉ xin làm rõ những khái niệm này để khi gặp phải vấn đề về Chars...
Phùng Văn Tú viết 4 năm trước
31 8
White
29 6
4 thành phần của Embedded Linux Ta biết rằng Linux chạy ở khắp nơi từ siêu máy tính, máy chủ, máy để bàn (máy xách tay), điện thoại (android)...ch...
Phùng Văn Tú viết hơn 2 năm trước
29 6
White
24 5
Gần đây tôi có dịp đụng vào CMake, nên có tìm hiểu một chút về nó. Hy vọng có ích cho anh em. Nó cung cấp tính năng sinh ra Makefile một cách hiệu...
Phùng Văn Tú viết 4 năm trước
24 5
Bài viết liên quan
White
13 5
GCC biên dịch một file .c thành file chạy trong 4 Stage. Preprocessing (tiền xử lý), Assembly Code Compiling (diên dịch sang mã Assembly), Machine ...
Phùng Văn Tú viết hơn 2 năm trước
13 5
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
13 bài viết.
96 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!