2010-08-05 43 views
8

Tôi đang sử dụng Microsoft Visual C++ 2010 và tôi cần tạo một ứng dụng không yêu cầu dll libcurl. Tôi định nghĩa CURL_STATICLIB trong các chỉ thị tiền xử lý và liên kết với libcurl.lib, libcurl_static.lib, ws2_32.lib và winmm.lib, nhưng nó vẫn yêu cầu dll hoạt động. Nếu tôi chỉ liên kết đến libcurl_static.lib, nó đã không xác định lỗi biểu tượng bên ngoài. Làm thế nào tôi có thể làm cho nó hoạt động?sử dụng libcurl mà không cần dll

Tôi cũng đã thử xây dựng nguồn nhưng tôi nhận được 13 lỗi (wow, số không may mắn) mà tất cả đều nói "lỗi C2011: 'pollfd': 'struct' type redefinition". Ai đó có thể giúp tôi có được libcurl làm việc?

Trả lời

11

Không có câu trả lời đơn giản :) Libcurl phụ thuộc vào libs của bên thứ ba khác (tùy thuộc vào phân phối nhị phân mà bạn đang sử dụng). Khi bạn loại bỏ DLL - bạn sẽ phải liên kết với các bên thứ ba tương ứng theo cách thủ công.

Ok, do đó, điểm đầu tiên là bạn không nên liên kết tới libcurl.lib vì nó liên kết bạn với DLL mà bạn không muốn.

Điểm thứ hai - khi bạn đang liên kết với libcurl_static.lib thì (như đã đề cập ở trên) bạn cũng sẽ có liên kết với thư viện tùy thuộc vào. Cách đơn giản để thực hiện điều đó là thực hiện một việc như sau:

#if defined CURL_STATICLIB 

#if defined _DEBUG 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Debug\\curllib_static.lib") 
#else 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Release\\curllib_static.lib") 
#endif 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\libeay32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\openldap.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\ssleay32.lib") 

#endif 

Nhưng theo cách này - bạn sẽ nhận được thêm ba phụ thuộc. Ngoài ra, bạn có thể tìm kiếm một cách để liên kết với chúng tĩnh, nhưng đó là một câu chuyện khác.

Như thay thế khác - bạn có thể xây dựng lại libcurl_static.lib từ các nguồn sau khi vô hiệu hóa tất cả các tính năng bạn không cần do đó loại bỏ sự phụ thuộc không mong muốn (như mô tả trong "Vô hiệu hóa giao thức cụ thể trong Win32 xây dựng" của INSTALL tập tin) .

Và điểm cuối cùng - vì libcurl có hỗ trợ khá kém cho việc biên dịch cửa sổ từ các nguồn, tôi khuyên bạn nên truy cập lại ý tưởng loại bỏ curllib.dll.

1

Tôi có một bản dựng tĩnh của libcurl để biên dịch và liên kết bằng cách chỉ định cả HTTP_ONLY và CURL_STATICLIB trong các chỉ thị tiền xử lý của dự án libcurl và ứng dụng của tôi. Điều này giúp loại bỏ tất cả các phụ thuộc theo yêu cầu của các giao thức mà bạn có thể không cần. Ứng dụng hiện hoạt động mà không yêu cầu bất kỳ DLL nào.

Bên cạnh phần trên, tôi chỉ cần đảm bảo libcurl.lib và đường dẫn đến curl bao gồm các tệp được đặt trong cài đặt dự án studio trực quan của ứng dụng.

Tài liệu tham khảo tôi đã sử dụng:

Vô hiệu hóa giao thức cụ thể trong Win32 xây dựng: http://curl.haxx.se/mail/lib-2011-12/0123.html

Sử dụng libcurl trong Visual Studio (out-ngày): http://curl.haxx.se/libcurl/c/visual_studio.pdf

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