01/10/2018, 08:24

Error while build C program on Ubuntu

Em moi cai Ubuntu nen ko the type tieng Viet dc, mong moi nguoi thong cam.
Em co’ thu? build 1 chuong trinh C bang terminal thi gap error nhu sau:

/tmp/ccqu41wG.o: In function `CheckPrimeNumber':
helloworld.c:(.text+0x5e): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

Con day la` source code (em code tren gedit)

#include <stdio.h>
#include <math.h>
#define bool _Bool
#define true 1
#define false 0
bool CheckPrimeNumber(int n)
{
    if (n < 2)
        return false;
    else if (n == 2)
        return true;
    else if (n & 0)
        return false;
    else {
        for (int i = 3; i <= sqrt(n); i += 2) {
            if (n % i == 0)
                return false;
        }
        return true;
    }
}
int main()
{
    int number = 7909;
    if (CheckPrimeNumber(number))
        printf("This is a prime number.
");
    else
        printf("This is not a prime number.
");
    return 0;
}

Giup em nhe’, cam on moi nguoi

Tao Không Ngu. viết 10:40 ngày 01/10/2018

Hi Long Dragon.
Bạn viết hello world trước nhé.

Long Dragon viết 10:38 ngày 01/10/2018

Bạn viết hello world trước nhé.

Là sao ? Cuốn Head First C có nói cú pháp là: gcc <source file> -o <new file> mà ?
Mình cũng build vài lần thì chạy bình thường, chỉ có trường hợp trên bị lỗi thôi

viết 10:38 ngày 01/10/2018

Bạn thử link thư viện math xem, biên dịch lại với command

gcc helloworld.c -o helloworld -lm
Tao Không Ngu. viết 10:25 ngày 01/10/2018

Hi Long Dragon.
Vậy là do code bạn sai rồi.
Đâu phải do trình biên dịch @_@!

OniRanger viết 10:33 ngày 01/10/2018

Sao bạn k giúp người ta đi, ngồi đấy cmt kiểu khinh thường người khác vậy?
Ngoài ra code bạn kia chả sai cái quái gì cả

Long Dragon viết 10:28 ngày 01/10/2018

Em build ok roi anh, nhung ket’ qua thi lai … sai
Ma vi sao phai them -lm the’ a ?

P/S: Cho e hoi? lam` sao de set Sublime lam’ default editor the’ a ? Moi lan’ mo file.c la no hien tren gedit ko a’

viết 10:34 ngày 01/10/2018

Vì thư viện math.h chỉ chứa các khai báo thôi, còn các implementation của các hàm trong đấy thì nó nằm ở thư viện libm.so. Để link lại thì đặt thêm flag -lm phía sau. Kết quả thì bạn xem lại thuật toán là được mà.
Set sublime làm default editor bạn có thể tham khảo bài này: http://superuser.com/questions/704046/change-default-text-editor-to-sublime-text-in-linux-mint

Tao Không Ngu. viết 10:26 ngày 01/10/2018

Hi OniRanger.
Bạn có thể giúp người khác một lần hai lần đâu thể giúp được cả đời.
Mình cũng không kinh thường ai cả vì không ai có quyền phán xét người khác.

Tao Không Ngu. viết 10:24 ngày 01/10/2018

Hi Long Dragon.
Bạn có thể xem log và nhận ra lỗi.

Sau đó chỉ cần copy lỗi đó và tìm trên GG.

Ngay link đầu tiên (Với một số lỗi dị thì có thể tham khảo thêm vài link nữa.)
Sau đó dọc một lúc bạn sẽ thấy có comment
‘‘If you read the man-page for sqrt, you will note that it states to link with -lm’’
Lên GG tìm “sqrt man page”.
VD https://www.mankier.com/3/sqrt.
Khi đó bạn có tài liệu chi tiết của hàm các giá trị trả về mây và mây mây…
Đọc đến cuối trang có danh sách các hàm tương tự.
cbrt(3), exp(3), exp10(3), exp2(3), glutSolidDodecahedron(3), glutWireDodecahedron(3), gmx-editconf(1), hypot(3), log(3), log10(3), log2(3), pow(3).
Khi đó nếu sau này gặp lỗi
undefined reference to `log()’ thì bạn cũng biết cách giải quyết mà không cần lại phải đi hỏi nữa.

Long Dragon viết 10:30 ngày 01/10/2018

@Phong_Ky_Vo Uhm, ky nang search cua e van chua tot’ lam’

@freedom vay tai sao cac’ IDE khac’ lai ko bi loi nay a ?
Ma` e ko the set sublime thanh default editor duoc vi file defaults.list chi read-only

Nguyễn Duy Hùng viết 10:40 ngày 01/10/2018

Nếu bạn code như vậy thì thay bằng i*i <= n luôn đỡ phải dùng hàm sqrt, chứ còn muốn tính căn 2 của n thì nên tính ở ngoài trước vòng lặp thì tốt hơn. Với lại bạn check một số int thì làm i <= n/2 cho đơn giản số int thì giới hạn của nó cũng cỡ 2 tỉ mấy thôi cho unsigned luôn là 4 tỉ hơn.

viết 10:27 ngày 01/10/2018

Có thể trình linker của các IDE đó mặc định đã có flag -lm rồi.
defaults.list chỉ read-only với group owner và others thôi, owner có quyền read-write mà. Nên bài viết đó mới mở file defaults.list với sudo. Mình ko cài sublime nên ko kiểm tra được, bạn thử lại theo hướng dẫn đó xem.

rogp10 viết 10:27 ngày 01/10/2018

n/2 thì quá lâu ấy chứ. Còn “đỡ phải dùng”? math.h nó là thư viện chuẩn thì có j mà phải sợ.

Long Dragon viết 10:25 ngày 01/10/2018

Khi em sudo ... toi defaults.list thi no bao: bash: cd: defaults.list: Not a directory => Phai fix sao anh ?

viết 10:39 ngày 01/10/2018

Khi em sudo … toi defaults.list thi no bao: bash: cd: defaults.list: Not a directory => Phai fix sao anh ?

cd là change directory, từ thư mục hiện hành tới 1 thư mục nào đó. defaults.list là 1 file, không thể cd tới 1 file được. Bạn làm theo bài hướng dẫn đi, bắt đầu bằng sudo subl /usr/share/applications/defaults.list. Trong đó subl là sublime text, /usr/share/applications/defaults.list là đường dẫn tới file defaults.list. Sau đó bạn thay thế gedit bằng sublime_text rồi save, reboot lại.

Tao Không Ngu. viết 10:28 ngày 01/10/2018

Hi Long Dragon.
Bạn cứ từ từ dành thời gian tìm hiểu hệ thống linux của mình đã. @_@!
Mình không nhớ rõ thì nautilus cũng có chọn công cụ mở file mặc định thì phải.

Nguyễn Duy Hùng viết 10:30 ngày 01/10/2018

He he với thời gian search google khắc phục cái lỗi kia thì mình mới làm như vậy. Bạn này gọi hàm sqrt trong mỗi loop thì đổi sang i*i <= n cũng thế. Còn chuyện N/2 lâu là tất nhiên nhưng bù lại thì nó tính đơn giản vì chỉ shift right 1 thôi, mình có nói nó tối ưu đâu.

rogp10 viết 10:31 ngày 01/10/2018

Làm như bạn thì cũng có cách là (s+=i << 1 - 1) < n (hằng đẳng thức) nhưng math.h là thư viện chuẩn mà ko cài vô cho biên dịch được thì là cả một vấn đề nhé.

Còn chuyện gọi trước hay sau là chuyện ko nói ra thì ai sửa.

Bài liên quan
0