2010-08-12 22 views
6

Tôi có một mã lớn, được biên dịch bằng/MT (tức là mong muốn liên kết tĩnh với CRT). Tôi cần kết hợp điều này với thư viện bên thứ ba tĩnh, được xây dựng bằng/MD (tức là mong muốn liên kết CRT động).được biên dịch bằng/MT và/MD

Về mặt lý thuyết có thể liên kết hai thành một tệp thực thi mà không cần biên dịch lại không?

Nếu tôi liên kết với/nodefaultlib: msvcrt, tôi kết thúc với một số lượng nhỏ tham chiếu chưa được xác định cho những thứ như __imp__wgetenv. Tôi bị cám dỗ để thử triển khai các chức năng đó trong mã của riêng tôi, chuyển tiếp đến wgetenv, v.v ... Có đáng để thử hay tôi sẽ chạy thẳng vào vấn đề tiếp theo?

Đáng tiếc là tôi đang Forbidden từ việc lựa chọn dễ dàng đóng gói mã thirdparty thành một DLL riêng biệt: -/

Trả lời

3

số/MT và/MD loại trừ lẫn nhau.

Tất cả các module truyền cho một invocation nhất định mối liên kết phải được biên soạn với cùng thời gian chạy tùy chọn biên dịch thư viện (/MD, /MT, /LD).

Source

+0

Không phải câu trả lời tôi mong đợi, nhưng cảm ơn ;-) – slowdog

0

tôi tìm thấy giải pháp như vậy trong nguồn OpenSSL: Tất cả các file obj của thư viện được biên soạn với sự kết hợp: /MT/Zl. Theo tác giả được mô tả, sự kết hợp này cho phép xây dựng thư viện tĩnh với khả năng biên dịch với các ứng dụng hoặc CRT động (/MD) hoặc CRT tĩnh (/MT).

0

Tôi gặp phải tình huống tương tự khi tôi có hai thư viện được xây dựng bằng MT và một thư viện khác có MD. Tôi đã phải xây dựng một tệp thực thi có sử dụng các chức năng từ cả hai thư viện. Thư viện được xây dựng như MD là bên thứ ba vì vậy tôi không thể xây dựng lại nó và thư viện được xây dựng vì MT có nhiều phụ thuộc và xây dựng tất cả chúng như MD là một nỗi đau lớn. Tôi đã nhận được lỗi từ tập tin tiêu đề cấu hình của bên thứ ba mà làm cho nó bắt buộc để xây dựng thực thi như MD. Tôi đã tìm kiếm cách dễ dàng để đóng gói dll của bên thứ ba như là một dll riêng biệt như đã đề cập trong câu hỏi. Tuy nhiên, tôi không thể tìm thấy đủ lời giải thích trực tuyến theo cách dễ dàng này. Do đó hai xu của tôi dưới đây. Sau đây là cách tôi phá vỡ nó

  1. Tôi đã tạo một .dll khác hoạt động như một giao diện. Giao diện này về cơ bản gói tất cả các cuộc gọi api đã được thực hiện cho dll bên thứ ba. Tệp tiêu đề cho giao diện này không bao gồm bất kỳ tệp tiêu đề nào từ dll của bên thứ ba thay vì tất cả các tệp tiêu đề đó được bao gồm trong tệp interface.cpp. Giao diện như bạn mong đợi được xây dựng như MD.
  2. Bây giờ Trong tệp main.cpp của tôi, tôi đã bao gồm tệp tiêu đề giao diện này để thực hiện tất cả các cuộc gọi đến dll của bên thứ ba thông qua giao diện.

  3. Cần chú ý thêm trong các đối số truyền vào giao diện. Các biến cơ bản như int, bool etc có thể được chuyển thành giá trị. Tuy nhiên bất kỳ lớp hoặc cấu trúc nào cần phải được chuyển như tham chiếu const để tránh tham nhũng đống. Điều này được áp dụng cho cả chuỗi.

Vui lòng chia sẻ thêm chi tiết nếu nó không rõ ràng!