Bài đăng đầu tiên của tôi trên trang này với hy vọng lớn :: Tôi đang cố gắng hiểu liên kết tĩnh, liên kết động, thư viện được chia sẻ, thư viện tĩnh, v.v. Mỗi lần tôi cố gắng nghiên cứu chủ đề này, tôi có một thứ mà tôi không hiểu lắm.trong gcc cách ép buộc độ phân giải biểu tượng tại thời gian chạy
Một số thực hành công việc:
bash$ cat main.c
#include "printhello.h"
#include "printbye.h"
void main()
{
PrintHello();
PrintBye();
}
bash$ cat printhello.h
void PrintHello();
bash$ cat printbye.h
void PrintBye();
bash$ cat printbye.c
#include <stdio.h>
void PrintBye()
{
printf("Bye bye\n");
}
bash$ cat printhello.c
#include <stdio.h>
void PrintHello()
{
printf("Hello World\n");
}
gcc -Wall -fPIC -c *.c -I.
gcc -shared -Wl,-soname,libcgreet.so.1 -o libcgreet.so.1.0 *.o
ln -sf libcgreet.so.1.0 libcgreet.so
ln -sf libcgreet.so.1.0 libcgreet.so.1
Vì vậy, tôi đã tạo ra một thư viện chia sẻ. Bây giờ tôi muốn liên kết thư viện được chia sẻ này với chương trình chính của tôi để tạo một tệp thực thi.
gcc -Wall -L. main.c -lcgreet -o greet
Nó rất tốt hoạt động và nếu tôi đặt LD_LIBRARY_PATH trước khi chạy chào (hoặc liên kết nó với tùy chọn rPath) tôi có thể làm cho nó hoạt động. Tuy nhiên, câu hỏi của tôi có thể khác nhau: Vì tôi vẫn sử dụng thư viện được chia sẻ, nên không thể buộc độ phân giải biểu tượng trong thời gian chạy (không chắc về thuật ngữ nhưng có thể được gọi là liên kết động theo sách "Trình liên kết và Trình tải") . Tôi hiểu rằng chúng tôi có thể không muốn làm điều đó bởi vì điều này làm cho chương trình chạy chậm và có chi phí mỗi khi chúng tôi muốn chạy chương trình, nhưng tôi đang cố gắng hiểu điều này để xóa các khái niệm của mình.
Trình liên kết gcc có cung cấp bất kỳ tùy chọn nào để trì hoãn độ phân giải biểu tượng khi chạy không? (để làm điều đó với thư viện chúng tôi thực sự sẽ chạy chương trình với) (như thư viện có sẵn tại thời gian biên dịch có thể khác với thư viện có sẵn trong thời gian chạy nếu có bất kỳ thay đổi nào trong thư viện) Tôi muốn có thể làm như vậy :
bash $ gcc main.c -I.
(tùy chọn cần thiết ở đây?) để tôi không phải đặt tên thư viện và chỉ cần nói rằng tôi muốn thực hiện độ phân giải biểu tượng trong thời gian chạy, vì vậy tiêu đề đủ tốt cho hiện tại không cần thiết.
Xin cảm ơn, Người học cho mãi mãi.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html – adf88
Đảm bảo rằng bạn gắn thẻ câu hỏi bằng ngôn ngữ thích hợp. Nó được gắn thẻ là C++, nhưng mã là C. Lưu ý rằng để có thể sử dụng thư viện động thuần túy tải mã trong C++ sẽ cần chứa thêm 'extern" C "' rắc xung quanh mà không cần thiết cũng không hợp lệ trong C. –