2009-06-24 28 views
6

Tôi gettings những loại lỗi trong một dự án MFC VS6 trong khi liên kết ứng dụng:thế nào để tránh "lỗi đã được xác định" trong C++

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj) 

tôi biết ý nghĩa của nó (một chức năng tồn tại trong 2 thư viện khác nhau); để giải quyết nó, tôi phải loại trừ một trong 2 thư viện (msvcrt.lib hoặc libc.lib).

Nhưng nếu tôi làm điều này thì có tất cả các loại lỗi bên ngoài chưa được giải quyết. Vì vậy, tôi muốn tiếp tục sử dụng cả hai thư viện.

Có cách nào để nói cho trình liên kết mà tôi muốn sử dụng chức năng _atoi trong libc.lib và không ở trong msvcrt.lib (hoặc cách khác xung quanh)?

Bất kỳ trợ giúp hoặc hướng nào đều tuyệt vời.

Trả lời

1

Dường như có một tùy chọn mà bạn có thể sử dụng để bỏ qua các lỗi như thế này: trong projectsettings> link> kiểm tra 'Force output output'. Điều này sẽ tạo ra chương trình ngay cả khi có mối liên kết.

Sản lượng xây dựng cho một cái gì đó như thế này:

msvcrt.lib (MSVCRT.dll): LNK4006 cảnh báo: _atoi đã được xác định trong LIBC.lib (atox.obj); Tất nhiên bạn sẽ cần phải sử dụng tùy chọn này cẩn thận vì nó có thể tạo ra một ứng dụng sẽ không hoạt động trong một số trường hợp, nhưng ở đây nó có thể không gây hại gì (tôi hy vọng).

Cảm ơn bạn đã trả lời các câu trả lời khác, nhưng điều đó dường như không phải là tùy chọn trong trường hợp cụ thể của tôi.

11

Lỗi này chắc chắn có nghĩa là bạn đang liên kết hai phần mã đã được biên dịch bằng cách sử dụng các thư viện thời gian chạy riêng biệt. MSVCRT.dll là phiên bản động, trong khi LIBC.lib là một phiên bản tĩnh. Nếu bạn làm điều này, tất cả các địa ngục tan vỡ. Hãy thử tìm những phần nào trong mã của bạn sử dụng phiên bản nào và sắp xếp nó ra.

+1

Chỉ có một vấn đề tương tự, vì tôi không quen thuộc với thế giới không được quản lý, bạn có thể cần các phiên bản khác nhau của thư viện của bên thứ ba tùy thuộc vào thư viện thời gian chạy của bạn và thư viện đó sử dụng. Tôi đã tải xuống một lib của bên thứ 3 và cố gắng liên kết nó với một dự án trong VC++ 2005. Đã tắt thư viện được sử dụng và phiên bản cũ hơn của thư viện thời gian chạy (a?) - LIBCP.LIB. May mắn thay các thư viện bên thứ 3 đã có sẵn nguồn của nó vì vậy tôi đã có thể comple nó với thư viện thời gian chạy VC2005. Tự hỏi làm thế nào tôi sẽ giải quyết điều này mà không có nguồn. – axk

4

Bạn có xung đột thời gian chạy. Sử dụng nhiều thư viện thời gian chạy thường là một điều xấu.

Bạn có thể sử dụng/nodefaultlib: msvcrt (hoặc/nodefaultlib: libc) trong tùy chọn trình liên kết của bạn để loại trừ một hoặc cái kia.

Thực ra, trước khi sử dụng điều đó, hãy kiểm tra cài đặt dự án của bạn. Nếu tôi nhớ chính xác, libc là thời gian chạy đơn luồng trong VS6 và msvcrt là thời gian chạy đa luồng. Nếu bạn có nhiều dự án trong giải pháp của mình, hãy đảm bảo rằng tất cả các dự án đều đang sử dụng một giải pháp hoặc một dự án khác.

+1

libc là tĩnh đơn luồng. libcmt là tĩnh đa luồng. msvcrt là một DLL và đa luồng. libc không còn khả dụng trong các bản phát hành MSVC hiện tại nữa. – MSalters

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