2011-01-03 25 views
8

Tôi có ứng dụng của bên thứ ba với nguồn, hiện đang được thiết lập để được xây dựng dựa trên libeay32MD.lib. Nhưng đây là ứng dụng, không phải thư viện. Không nên nó được xây dựng với libeay32MT.lib sau đó? Sự khác biệt giữa hai là gì?Sự khác biệt giữa liên kết lại libeay32MD.lib và libeay32MT.lib là gì?

Có các biến thể sau đây của thư viện:

  • libeay32MD.lib
  • libeay32MDd.lib
  • libeay32MT.lib
  • libeay32MTd.lib

và những "tĩnh" có cùng tên. Bạn có thể giải thích sự khác biệt giữa tất cả chúng?

Trả lời

8
  • MD cho động phát hành
  • MDd cho động-debug
  • MT cho tĩnh giải phóng
  • MTd cho tĩnh-debug

Source article qua archive.org [^ 1] .

[^ 1]: Original Link

+0

Cảm ơn rất nhiều. Tôi có hiểu chính xác, động lực đó có nghĩa là exe đích sẽ yêu cầu các tệp DLL của OpenSSL và các phương tiện tĩnh mà tất cả mã OpenSSL được hợp nhất thành thực thi đích và không yêu cầu DDL bên ngoài? –

+1

Vâng, đúng vậy. Tôi không phải là một chuyên gia về điều này, nhưng về cơ bản nó có nghĩa là các DLL phải nằm trong cùng thư mục với tệp .exe, hoặc chúng cần nằm trong đường dẫn của bạn. Có nhiều cách phức tạp hơn để đăng ký các tệp DLL và tương tự, nhưng địa ngục DLL khiến tôi trở nên điên loạn và cuối cùng tôi chỉ gắn chúng vào thư mục .exe. – metasim

+0

Liên kết bị hỏng. Đây là từ lưu trữ web: http://web.archive.org/web/20110415080451/http://www.curlpp.org/index.php/faq/50-how-to-build-openssl-on-win32- nền tảng-cho-sử dụng-với-libcurl – loentar

0

Đoán từ tên, một thư viện dành cho đa luồng và một cho đa luồng có biểu tượng gỡ lỗi.

+0

Tôi không chắc chắn vì cũng có libeay32MTd.lib và libeay32MDd.lib. Đã cập nhật câu hỏi. –

7

Những biến thể xác định C++ thư viện được sử dụng, và những gì loại mã được tạo ra, mặc dù chỉ có 'M' có sẵn nghĩa đa luồng, không có lựa chọn đơn luồng nữa không.

  • MTD = đa luồng gỡ lỗi mã, và liên kết với C++ debug thư viện tĩnh
  • MDD = đa luồng gỡ lỗi mã, và liên kết với C++ động (DLL) thư viện debug
  • MT = đa luồng, liên kết đến thư viện C++ tĩnh
  • MD = đa luồng, liên kết với C++ động (DLL) thư viện

Chỉ cần thay đổi nội dung - xin lỗi, mã là theo thứ tự sai.

Chỉnh sửa 2: Thông tin thêm ...

Những lá cờ là C++ tùy chọn và không có gì để làm với yêu cầu ssleay32.dll và libeay32.dll. Có 8 phiên bản libeay32 - 4 cho một bản dựng tĩnh (không phụ thuộc vào ssl/libeay32.dll) và 4 cho xây dựng động (yêu cầu ssl/libeay32.dll). Mỗi phòng trong số 4 được chia thành loại Thư viện C++ bắt buộc ...

Có thể liên kết tĩnh hoặc động với ứng dụng của bạn và cho mỗi loại này bạn có thể sử dụng thư viện gỡ lỗi hoặc thư viện phát hành.

/MT và/MTd (tĩnh) không yêu cầu mã có thể phân phối lại C++ vì tất cả các cuộc gọi C/C++ đều nằm trong chương trình được biên dịch của bạn.Nếu mọi mô-đun (không chỉ ssleay & co.) Bạn liên kết để sử dụng các tùy chọn này, ứng dụng của bạn sẽ hoàn toàn độc lập về mặt phụ thuộc C++.

/MD và/MDd (động) cần cài đặt DLL Redistributable C++ trên máy tính đích. Đối với/MD các bản phát hành có thể dễ dàng tải xuống từ MSFT, nhưng bạn cũng cần lưu ý phiên bản Visual C++ nào bạn đã sử dụng - ví dụ: VC++ 2008, VC++ 2010 vv có nhiều phiên bản của phân phối lại mà bạn có thể cần. Đối với/MDd, các thư viện sẽ được trên máy tính phát triển của bạn nhưng không có phát hành chung từ MSFT cho điều này - nhưng bạn có thể xây dựng trình cài đặt của riêng bạn nếu cần thiết bằng cách sử dụng Visual Studio; thường/MDd chỉ được nhà phát triển sử dụng để thử nghiệm.

Các phiên bản của SSLEAY vv trong câu hỏi ban đầu không cho biết phiên bản 2005/2008/2010 của Visual C++ được sử dụng để biên dịch các phiên bản MD, nhưng khi được biên dịch, nó có thể được ghi nhận từ mục tiêu được xây dựng bằng cách sử dụng phụ thuộc người xem (ví dụ: depends.exe). Ví dụ. nếu ứng dụng của bạn phụ thuộc vào MSVCR90.DLL, thì điều đó có nghĩa là VC++ 9 (gây nhầm lẫn, đó là phân phối lại năm 2008).

Tất cả các nhà phát triển cần tùy chọn để chọn tĩnh hoặc thư viện DLL liên kết, sau đây là một số ghi chú trên mỗi:

liên kết tĩnh:

  • khép kín, dễ cài đặt, mã lớn hơn dấu chân, trùng lặp mã khi xây dựng nhiều dll và exe.

động liên kết:

  • dấu chân nhỏ hơn, sửa lỗi từ bản cập nhật MSFT, mã chia sẻ, một chút khó khăn hơn để cài đặt

Khi bạn có mã trong một thư viện mà trả về một C/Đối tượng C++ (ví dụ: bộ nhớ được phân bổ, std :: string, v.v.) là bắt buộc để liên kết mã của bạn với cùng một cờ được sử dụng để biên dịch thư viện, không có ngoại lệ.

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