2009-04-20 39 views
8

Tôi đang trong quá trình chuyển một ứng dụng C++ lớn từ Linux (gcc) sang Windows (Visual C++ 2008) và đang gặp sự cố liên kết với các plugin. Trên Linux, đây không phải là vấn đề vì nó hỗ trợ tra cứu biểu tượng thời gian chạy, nhưng dll dường như không hỗ trợ điều này.Visual C++ - Liên kết plugin DLL với EXE?

Ứng dụng (máy chủ), lưu trữ môi trường kịch bản, cung cấp giao diện cho plugin mà không biên dịch lại ứng dụng máy chủ. Trên Linux, đây chỉ là vấn đề bao gồm tiêu đề của ứng dụng máy chủ trong nguồn plugin, nhưng trên Windows, tôi nhận được lỗi trình liên kết. Tôi không chắc chắn chính xác những gì tôi cần phải liên kết với Visual C++ để giải quyết những biểu tượng này.

Một trong những phụ thuộc của chúng tôi (mã nguồn mở, LGPL) có các khai báo tiền xử lý mà nó sử dụng để chèn __declspec (dllexport) và __declspec (dllimport) vào các tiêu đề của nó. Một số nghiên cứu trước đây chỉ ra rằng tôi có thể phải làm điều này là tốt, nhưng tôi muốn chắc chắn trước khi tôi sửa đổi một loạt các tiêu đề cốt lõi. (Trước đây tôi có thể làm việc này trên MinGW, nhưng chúng tôi đã quyết định hỗ trợ Visual Studio là một yêu cầu đối với loại dự án thương mại này.)

Câu hỏi của tôi, tóm lại: Làm cách nào để liên kết thời gian chạy- nạp dlls chống lại một exe máy chủ trong Visual C++?

Chỉnh sửa: Để làm rõ vấn đề với ví dụ, tôi có một lớp trong ứng dụng máy chủ của mình, Đối tượng, thể hiện loại cơ sở của đối tượng có thể được truy cập bằng tập lệnh. Trong các plugin của tôi, tôi có một số lớp mở rộng Đối tượng để thực hiện các chức năng khác, chẳng hạn như tích hợp hỗ trợ mạng hoặc các yếu tố hình ảnh mới. Điều này có nghĩa rằng dll của tôi phải liên kết với các biểu tượng trong exe máy chủ, và tôi không chắc chắn làm thế nào để làm điều đó.

+0

Tôi đang gặp một chút rắc rối khi quấn đầu quanh việc này. Nếu bạn có một ví dụ cụ thể và đơn giản hóa nó thành một vài dòng mã có thể giúp mọi người giúp bạn. – ojblass

Trả lời

5

Bạn có ý nghĩa gì khi "tra cứu ký hiệu thời gian chạy"? Bạn có muốn tự động tải thư viện bằng cách sử dụng dlopendlsymso on không? equivalents in Windows được gọi là LoadLibraryGetProcAddress.

Trong cửa sổ, bạn không xuất các biểu tượng từ tệp thực thi. Bạn chỉ nên xuất chúng từ một dll. Cách đúng để giải quyết vấn đề của bạn là rearchitect để các biểu tượng được xuất hiện nằm trong dll mà các dll plugin thực thi và các plugin khác có thể liên kết với nhau.

+0

Đó chính xác là nó, và tôi có thể làm điều đó tốt, nhưng tôi không thể tìm ra cách biên dịch dll đó dựa vào các ký hiệu được xác định trong tập tin thực thi của tôi (Xem bản chỉnh sửa gần đây của tôi) –

+4

Bạn _can_ export symbols from EXE; chỉ cần sử dụng GetProcAddress (GetModuleHandle (NULL), "MyProc)) để chọn chúng. –

+1

... nhưng trình tải Windows sẽ không tự động thực hiện việc này cho bạn. –

1

Bạn không thể, dễ dàng. Trình tải cửa sổ không được thiết kế để xuất các ký hiệu ra khỏi EXE và liên kết chúng với các biểu tượng trong một tệp DLL.

Một mẫu mà tôi đã thấy là DLL xuất một chức năng nhất định mà EXE gọi. Nó lấy làm tham số một cấu trúc chứa các địa chỉ của các hàm trong EXE cho DLL để gọi.

1

Như thông tin 1800 nói, đừng làm như vậy. Di chuyển đối tượng ra khỏi tập tin thực thi và vào một "thứ ba" DLL. Liên kết các plugin và tệp thực thi với điều đó.

1

Tôi đã thực hiện tương tự, xây dựng thư viện plugin để xây dựng trong cả Linux và Windows.

Giải pháp trong Linux là sử dụng tùy chọn -rdynamic trong dòng lệnh gcc. Điều này xuất khẩu tất cả các biểu tượng trong thực thi chính, để một plugin có thể tìm thấy chúng khi tải.

Trong Windows, giải pháp là thêm __declspec (dllexport) vào trước định nghĩa của các hàm đó trong exe mà bạn muốn các dll sử dụng.Biên dịch sẽ tạo một tệp .lib cho các dll liên kết tới. Chắc chắn hoạt động theo Visual studio 2008. Bài liên quan: https://stackoverflow.com/a/3756083/1486836

Các vấn đề liên quan