Tôi đang viết một chương trình C nhỏ sử dụng librt. Tôi khá ngạc nhiên rằng chương trình sẽ không biên dịch nếu tôi đặt cờ liên kết vào đầu thay vì ở cuối:Tại sao cờ liên kết thư viện đôi khi phải đi vào cuối bằng GCC?
Tại thời điểm này, để biên dịch chương trình tôi làm:
gcc -o prog prog.c -lrt -std=gnu99
Nếu tôi được làm những điều sau đây, nó sẽ thất bại trong việc tìm ra các chức năng trong librt:
gcc -std=gnu99 -lrt -o prog prog.c
Tuy nhiên, điều này làm việc với các thư viện khác. Tôi đã tìm thấy sự cố khi cố gắng sử dụng Makefile đơn giản. thực hiện prog.c thực sự biên dịch mà không thích đầu tiên (sử dụng cờ c) và sau đó đã làm các liên kết.
Đây là Makefile:
CC = gcc
CFLAGS = -std=gnu99
LIBS= -lrt
LDFLAGS := -lrt
prog: prog.o
$(CC) -o prog prog.c -lrt -std=gnu99
Sản lượng tôi sẽ nhận được khi gõ làm sẽ là:
gcc -std=gnu99 -c -o prog.o prog.c
gcc -lrt prog.o -o prog
prog.o: In function `main':
prog.c:(.text+0xe6): undefined reference to `clock_gettime'
prog.c:(.text+0x2fc): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [buff] Error 1
Bây giờ tôi đã soạn thảo một Makefile mà đặt các liên kết ở phần cuối của gcc dòng, tuy nhiên tôi đang bối rối tại sao nó không hoạt động nếu cờ liên kết là lúc bắt đầu.
Tôi sẽ đánh giá cao nếu có ai có thể giải thích điều này với tôi. Cảm ơn.
Tôi không phải là 100% về điều này, nhưng tôi nghĩ rằng các mối liên kết có thể được xem xét librt và quyết định nó không cần bất cứ điều gì trong đó, vì vậy chỉ cần ném nó đi. Librt là một thư viện tĩnh? – spencercw
Xem câu trả lời cho câu hỏi này để giải thích tại sao liên kết tĩnh phụ thuộc vào đơn đặt hàng: http: //stackoverflow.com/questions/45135/linker-order-gcc –
Có thể liên quan đến tùy chọn * khi cần thiết * của liên kết đang được sử dụng theo mặc định. Bạn có thể thử 'gcc -std = gnu99 -Wl, -no-as-needed -lrt -o prog.c' –