2010-05-17 35 views
6

Tôi đã có dự án C++ bản địa VS2008, mà tôi muốn biên dịch thành một DLL.Dự án C++ biên dịch thành lib tĩnh, không thành công (lỗi liên kết) dưới dạng lib động. tại sao?

Nó chỉ tham chiếu một thư viện bên ngoài (log4cplus.lib) và sử dụng các chức năng của nó. (cũng sử dụng các tệp .h của log4cplus, một cách tự nhiên).

Khi tôi cố gắng biên dịch dự án của mình như một thư viện tĩnh, nó thành công. Khi tôi cố gắng như DLL, nó không thành công:

1>MessageWriter.obj : error LNK2019: unresolved external symbol "public: static class log4cplus::Logger __cdecl log4cplus::Logger::getInstance(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" ([email protected]@[email protected]@[email protected][email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@@Z) referenced in function "class log4cplus::Logger __cdecl Log(void)" ([email protected]@[email protected]@@XZ) 

Có thêm 4 lỗi như thế này liên quan đến chức năng trong log4cplus.lib.

Có vẻ như điều gì đó thực sự ngu ngốc .. hãy giúp tôi :)

Cảm ơn!

Chỉnh sửa:

Tôi được liên kết với tệp log4cplus.lib và nó thấy nó rất ổn. cũng vậy, log4cplus.lib là chức năng 100%, tôi đang sử dụng nó trong một dự án khác mà không có vấn đề gì. Ý định ban đầu của tôi là biên dịch dự án của tôi thành một thư viện tĩnh và sử dụng nó trong một DLL khác mà tôi đang viết, nhưng khi làm điều này, tôi nhận được cùng một lỗi liên kết trong dự án khác ...

Edit # 2:

Các chức năng gây ra lỗi liên kết là các hàm tĩnh .. đây có phải là một phần của sự cố không?

Trả lời

1

Bạn có thực sự liên kết với tệp log2cplus.lib không? Nếu bạn đang biên dịch như một thư viện tĩnh thì bạn sẽ liên kết với nó thông qua tệp .exe cuối cùng chứ không phải trong thư viện tĩnh - có lẽ đó là sự khác biệt?

+0

vâng, tôi đang liên kết với các tập tin log4cplus.lib ... – Roey

+0

OK mát - và đó là trong đường dẫn thư viện? – trojanfoe

+0

có, nó tìm thấy các tập tin chắc chắn (khi tôi thay đổi tên lib để một cái gì đó không có thật biên dịch thất bại ngay lập tức) ... Tôi không hiểu tại sao nó không tìm thấy các chức năng này bên trong log4cplus.lib ... :( – Roey

4

Khi bạn đang tạo thư viện tĩnh, người tạo thư viện không cố gắng giải quyết tất cả các chức năng mà bạn đang sử dụng (những hàm đang ở log2cplus.lib). Các hàm này được giải quyết khi bạn tạo một tệp thực thi liên kết với thư viện tĩnh của bạn.

Khi bạn đang tạo thư viện động, người tạo thư viện (trình liên kết) sẽ cố gắng giải quyết tất cả các chức năng bạn đang sử dụng. Bạn phải cung cấp trình liên kết với thư viện log4cplus.lib ngay sau khi bạn xây dựng thư viện động. Bạn không thể đợi cho đến khi bạn tạo tệp thực thi.

+0

Tôi đã cung cấp nó với log4cplus.lib .... Tôi đã thêm nó vào phần "linker" của thuộc tính dự án ... – Roey

+0

Nó tìm thấy tệp cho chắc chắn ... như tôi đã nêu dưới đây ... nó chỉ không nhận ra một số chức năng trong nó vì lý do nào đó ... – Roey

0

Bạn có sử dụng __declspec (dllimport) và __declspec (dllexport) không?

Chúng không cần thiết khi liên kết các thư viện tĩnh, nhưng bắt buộc đối với các tệp DLL. Hàm này phải được khai báo để xuất (trong DLL), vì vậy người dùng có thể sử dụng nó bên ngoài (và do đó nhập nó từ tệp DLL).

Có lẽ điều này có thể giúp:

nhập vào một ứng dụng Sử dụng __declspec (dllimport)

http://msdn.microsoft.com/en-us/library/8fskxacy%28VS.80%29.aspx

Trân

0

Nếu bạn đang sử dụng một trình biên dịch như MSVC, sau đó nó có thể đã thay đổi cài đặt dự án mà bạn không biết về nó khi thay đổi từ lib thành dll. Bạn nên kiểm tra kỹ trong chế độ DLL, bạn được liên kết đúng với thư viện lib.

2

Trong cả hai trường hợp, bạn cần liên kết với thư viện.

Sự khác biệt là khi bạn liên kết tĩnh - tất cả chức năng được liên kết qua thư viện bạn đang sử dụng.

Khi bạn đang liên kết động bạn liên kết với thư viện nhập có chức năng tải và sử dụng các hàm từ dll và bước này bạn đang thiếu. Thông thường thư viện nhập khẩu có cùng tên với dll bạn đang liên kết chống lại.

Edit:

tôi thấy nó mà thiếu biểu tượng không phải là '__imp ...' này có nghĩa là tập tin tiêu đề không phải là "cấu hình" cho liên kết năng động, có lẽ bởi vì bạn có LOG4CPLUS_BUILD_DLL hoặc log4cplus_EXPORTS hoặc DLL_EXPORT không được định nghĩa trong dự án nơi bạn bao gồm tiêu đề Log4Cplus.

+0

Tôi nên đặt DLL ở đâu? – Roey

+0

DLL không được tải chỉ trong thời gian chạy? tại sao các mối liên kết sẽ cố gắng tìm nó? – Roey

+0

Phải, nhưng bạn cần một số thông tin về dll và cách truy cập nó, vì nó có thư viện nhập. Tôi nghĩ rằng tôi biết những gì là sai - xem cập nhật của tôi. – XAder

0

Có hai khả năng mà tôi có thể nhìn thấy mối liên kết cho các lỗi:

  1. Bạn đã biên soạn các log4cplus.dll (và các thư viện import log4cplus.lib liên quan) bằng cách sử dụng cung cấp cấu hình phiên bản build nhưng bây giờ của bạn ứng dụng được biên dịch với tùy chọn "Character Set" được đặt thành "Use Unicode Character Set"

  2. Hoặc bạn đang cố gắng sử dụng thư viện tĩnh của log4cplus nhưng xác định LOG4CPLUS_BUILD_DLL cho ứng dụng của bạn.

Tôi đặt cược vào số 1. Vẫn có thể là điều gì đó khác. Bạn đang sử dụng phiên bản log4cplus nào?

Nếu bạn muốn sử dụng log4cplus.dll trong ứng dụng của mình, hãy xác định biểu tượng LOG4CPLUS_BUILD_DLL. log4cplus_EXPORTS và DLL_EXPORT chỉ có để hỗ trợ hệ thống xây dựng dựa trên CMake và hệ thống xây dựng dựa trên tự động tương ứng trên MingGW.

6

wilx là đúng. Tôi có cùng một vấn đề liên kết.

tôi mất gần một ngày để giải quyết vấn đề này.

Tôi đã tải xuống log4cplus-1.0.4, sau khi tôi đã mở dự án này với studio trực quan 2010, biên dịch nó, cả thư viện tĩnh và động, không có lỗi.

tuy nhiên, khi tôi cố gắng sử dụng các thư viện đó, tôi gặp lỗi liên kết, bất kể thư viện tĩnh hoặc thư viện động.

lý do là, theo mặc định, các dự án sử dụng ký tự nhiều byte, tuy nhiên, dự án của riêng tôi sử dụng unicode, do đó, để slove những vấn đề liên kết, bạn chỉ cần thay đổi một bộ ký tự của dự án.

cả hai bảng mã đơn hoặc cả hai byte.

và thay đổi một bộ ký tự của dự án trong studio hình ảnh 2010, xem liên kết sau.

How do I turn off Unicode in a VC++ project?

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