Tôi đang tải động (whith dlopen()
) một đối tượng được chia sẻ (có tên libprofile1.so
) từ main
.ràng buộc khi tự động tải một đối tượng được chia sẻ từ một đối tượng được chia sẻ khác?
Trong libprofile1.so
Tôi đã xác định chức năng nhà máy CreateProfile
và lớp Profile
. Hàm CreateProfile
tạo ra một thể hiện của lớp Profile
và trả về một con trỏ tới nó. Lớp Profile
có phương thức pMethod
.
Trong chính, sau khi tải libprofile1.so
, tôi gọi phương thức CreateProfile
trả về con trỏ tới đối tượng của lớp Profile
(gọi là p
).
Sau đó, tôi gọi phương thức pMethod
đối với đối tượng p
(p->pMethod
). Trong phương pháp này, tôi tự động tải đối tượng được chia sẻ khác (libdatasources.so
).
Trong đối tượng dùng chung này, tôi có chức năng nhà máy CreateDataSource
và lớp DataSource
.
CreateDataSource
chức năng tạo ra một thể hiện của lớp DataSource
và trả về một con trỏ đến nó. DataSource
lớp học có phương pháp dsMethod
.
Như bạn có thể nhận thấy, cấu trúc của cả hai đối tượng dùng chung là tương tự nhau.
Từ pMethod
sau khi tải libdatasources.so
Tôi đang gọi phương thức CreateDataSource
, trả về con trỏ đến một phiên bản DataSource
, gọi là ds
. Sau đó, tôi gọi số dsMethod
của ds
đối tượng
(ds->dsMethod
).
Hiện tại, sự cố xảy ra.
Khi tôi cố gắng gọi dsMethod
của đối tượng ds
, đối tượng được chia sẻ mà tôi tải lần đầu tiên (libprofile1.so
) không tải. Trên thực tế, dlopen()
trả lại NULL
. Khi tôi đọc dlerror
sau dlopen
tôi nhận được:
./libprofile1.so: undefined symbol: _ZN18DataSource13dsMethod
Vì vậy, nếu tôi có một cuộc gọi ds->Method
, hơn đầu tiên chia sẻ đối tượng không tải!
Nếu tôi nhận xét cuộc gọi ds->dsMethod
từ nguồn, thì libprofile1.so
và libdatasources.so
của tôi được tải mà không gặp bất kỳ sự cố nào.
Tôi không thấy kết nối giữa cuộc gọi của một phương thức từ SO thứ hai, với tải SO đầu tiên ???
Có lẽ tôi không biết, nhưng có bất kỳ ràng buộc nào khi tải động một đối tượng được chia sẻ, từ một đối tượng được chia sẻ cũng được tải động không?
Btw, dlopen
được sử dụng với RTLD_NOW|RTLD_GLOBAL
. Tôi đã thử với RTLD_LAZY
, nhưng vẫn còn cùng một vấn đề.
UPDATE:
Thư viện được xây dựng trong Eclipse. Các tùy chọn cho trình biên dịch và trình liên kết G ++ giống nhau cho cả hai thư viện.
Dưới đây là G ++:
-O0 -g3 -Wall -c -fmessage-length=0
và G ++ linker:
-shared
tùy chọn, dán từ Project Properties -> Settings -> Tool Settings
Cảm ơn trước.
Bạn có thể cập nhật câu hỏi của mình cho biết cách libprofile1.so và libdataresources.so được tạo không? –