thể trùng lặp:
gcc: why the -lm flag is needed to link the math library?Tại sao bạn cần một 'tùy chọn biên dịch -lm` rõ ràng
Nói chung, để sử dụng bất kỳ các hàm toán học ngoài bao gồm tiêu đề file math.h
bạn phải liên kết với tùy chọn liên kết -lm. -l
ở đây có nghĩa là tùy chọn trình liên kết để tìm kiếm thư viện cụ thể libm.o
.
Câu hỏi của tôi là
Tại sao GCC không bao gồm thư viện này theo mặc định? Có phải vì thư viện sử dụng rất nhiều bộ xử lý toán học và nó đòi hỏi phải thêm một chút mã để khởi tạo việc khởi tạo điểm nổi (tôi có thể sử dụng thuật ngữ sai ở đây)?
Note
Tôi đã xem xét tất cả các câu trả lời được đề cập trong liên kết http://stackoverflow.com. Điều này không có ý nghĩa với tôi. Có ba lý do cơ bản được gán cho
- Thư viện chuẩn được đảm bảo khả dụng. Việc liên kết các thư viện posix khác như pthread rõ ràng có ý nghĩa, nhưng tại sao chúng ta phải tạo một liên kết rõ ràng cho một thư viện chuẩn. Ngay cả lý do lịch sử cũng không rõ ràng lắm.
- Tại sao libm được tách khỏi libc?
- Tại sao chúng ta vẫn kế thừa những hành vi này trong các trình biên dịch gcc gần đây? Điều gì đơn giản nó đạt được? Đây là những gì tôi đã thử nghiệm, không có libm và với libm. The One mà không libm, tôi đã viết phiên bản riêng của tôi về Pow
Dưới đây là ví dụ
[email protected]:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
int i=20;
double output1=pow(2.618033988749895,i);
return 0;
}
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y) {
double _Z = 1;
for (; _Y; _X *= _X) {
if (_Y & 1) _Z *= _X;
_Y >>= 1;
}
return _Z;
}
int main() {
int i=20;
double output1=Pow(2.618033988749895,i);
return 0;
}
[email protected]:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
[email protected]:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241
Lý do lịch sử, tôi đoán vậy. Trình liên kết phải dễ dàng không thể liên kết các hàm không được sử dụng. MSVC không cần một libm hoặc cho bạn sử dụng các hàm toán học. – Joey
Bạn không cần nó với C++. – Mat