2012-04-28 46 views
11

Đây có thể là câu hỏi của Visual Studio hơn bất kỳ điều gì khác ...
Tôi đang cố gắng xây dựng a 0MQ C++ example bằng cách sử dụng VS10 và ZeroMQ 2.2.0.
Tôi đã tải xuống windows sources và cố gắng theo dõi these instructions để xây dựng 0MQ tĩnh. Cụ thể là:liên kết với thư viện tĩnh 0MQ trong VS

  • Chuyển sang Thả
  • Đối với tất cả 7 dự án trong dung dịch:
    • thiết General\Configuration Type-Static library (.lib)
    • thiết C/C++\Code Generation\Runtime Library để Multi-threaded (/MT)
    • thêm ZMQ_STATIC để C/C++\Preprocessor\Preprocessor Definitions
  • Cập nhật zmq.hzmq_utils.h để nếu _MSC_VERZMQ_STATIC được định nghĩa sau đó DLL_EXPORT cũng sẽ được xác định

Tại thời điểm này 0MQ dường như để xây dựng tốt.

  • Tạo một giao diện điều khiển dự án có sản phẩm nào:
    • chuyển sang Thả
    • thêm một file cpp duy nhất với các ví dụ liên kết ở trên
      • thay đổi random-rand, srandom để srandsnprintf-_snprintf
    • thiết C/C++\Code Generation\Runtime Library để Multi-threaded (/MT)
    • thêm ...\zeromq-2.2.0\include thư mục để C/C++\General\Additional Include Directories
    • thêm ...\zeromq-2.2.0\builds\msvc\Release\*.lib để Linker\Input\Additional Dependencies

Tuy nhiên tôi vẫn nhận được lỗi liên kết sau đây:

1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_bind 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_close 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_errno 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_init 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_data 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_strerror 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_socket 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_init_size 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_term 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_close 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_send 

Tôi phải làm gì nhỡ?

Trả lời

17

Bạn cũng nên thêm ZMQ_STATIC vào C/C++\Preprocessor\Preprocessor Definitions trong "dự án bảng điều khiển trống" của mình. Nếu không, khi bạn biên dịch ứng dụng của bạn, ZMQ_EXPORT trong zmq.h được định nghĩa là __declspec(dllimport), và kết quả là, MSVC tìm kiếm __imp__zmq_* ký tự thay vì zmq_*

+0

Để làm rõ, xác định ZMQ_STATIC có nghĩa là không có đánh dấu DLL nào được sử dụng (không phải __declspec (dllimport) hoặc __declspec (dllexport) được xác định) –

1

Là tĩnh liên kết rất quan trọng đối với bạn? Nếu không, bạn có thể thử câu trả lời thứ hai bởi elnino_9 here. Xây dựng câu trả lời của elnino_9:

  • Tải xuống sources và giải nén vào một số thư mục cục bộ (ví dụ: C: \ dev \ zeromq).
  • Đi tới C: \ dev \ zeromq-2.2.0 \ builds \ msvc và mở giải pháp msvc.sln. MS2010 sẽ nâng cấp từ VS2008 lên dự án VS2010
  • Xây dựng tất cả các dự án.
  • Việc xây dựng sẽ tạo ra hai tập tin sau đây:
    • C: \ dev \ zeromq \ lib \ libzmq.lib - đây là những gì bạn sẽ cần phải tham khảo trong các tùy chọn liên kết của dự án của bạn
    • C: \ dev \ zeromq_boaz \ builds \ msvc \ Release \ libzmq.dll - điều này bạn sẽ cần phải sao chép vào cùng một thư mục như thực thi của dự án của bạn để chạy nó (nếu xây dựng của bạn được cấu hình để 'Debug', đường dẫn sẽ là C: \ dev \ zeromq \ builds \ msvc \ Gỡ lỗi \ libzmq.dll)
  • Tạo giải pháp và dự án của bạn. Thực hiện như sau:
    • Trong Solution Explorer, nhấp chuột phải vào dự án của bạn và chọn 'Thuộc tính' (ở dưới cùng).
    • Điều hướng đến 'C/C++ -> Chung -> Thư mục Bao gồm Bổ sung' và thêm C: \ dev \ zeromq \ include. Điều này sẽ tham chiếu các tệp tiêu đề của 0MQ.
    • Điều hướng đến 'Trình liên kết -> Đầu vào -> Phụ thuộc bổ sung' và thêm đường dẫn đầy đủ vào tệp 'libzmq.dll' từ bước trước đó.
    • Xây dựng dự án của bạn - điều này sẽ không bị lỗi ngay bây giờ.
  • Sao chép 'libzmq.dll' vào cùng thư mục với tệp thực thi của bạn - dự án của bạn bây giờ sẽ chạy.

Một số nhận xét:

  • Tôi không chắc chắn lý do tại sao bạn cần phải tham khảo các tập tin 'libzmq.lib'. Nó không phải là cần thiết bởi thực thi (bạn có thể xóa nó, và nó vẫn sẽ chạy, như logic cần thiết nằm trong dll). Ai đó có thể giải thích điều này?
  • Lưu ý một báo trước trong ví dụ cho người dùng Windows - câu lệnh ràng buộc thứ hai (publisher.bind("ipc://weather.ipc");) sẽ gây ra một ngoại lệ. Như đã giải thích here (mặc dù in mịn), Giao thức vận tải liên tiến trình không được hỗ trợ trên Windows.

EDIT

Tôi nghĩ rằng câu trả lời cho nhận xét đầu tiên của tôi có thể được tìm thấy trong MSDN:

"Khi mã nguồn cho các thực thi gọi được biên dịch, lắp ráp, hàm DLL cuộc gọi tạo ra một tham chiếu hàm bên ngoài trong mã đối tượng Để giải quyết tham chiếu bên ngoài này, ứng dụng phải liên kết với thư viện nhập (tệp .lib) do nhà sản xuất DLL cung cấp. "

+0

Câu hỏi đặc biệt về liên kết tĩnh, vì vậy không nên sử dụng DLL. –

4

Tôi đã có lỗi tương tự - không phải khi cố gắng liên kết tĩnh, nhưng chỉ cố gắng tạo dự án ZMQ và liên kết .lib 'stubs' cho dll.

Trong trường hợp của tôi, đó là vì tôi đã cố liên kết các thư viện 64 bit vào một dự án 32 bit. Tôi đã tải xuống phiên bản sai. Khi tôi nhận được những cái đúng, tức là x86 thay vì x64, nó hoạt động.

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