Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: [Hỏi] Về Lỗi LNK 2005 và chỉ lệnh Linker /FORCE

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Mặc định [Hỏi] Về Lỗi LNK 2005 và chỉ lệnh Linker /FORCE

    Trong ứng dụng của em có tạo một file header MyResource.h để chứa các Biến, các Lớp sẽ được dùng chung cho toàn bộ chương trình.
    Giả sử bây giờ ứng dụng của em có 3 Dialog : MyAppDlg (Main Dlg), MyAppLoginDlg , MyAppEditDlg.
    Trong MyAppDlg của em có một button gọi là Login. Khi em nhấn Login sẽ xuất hiện MyAppLoginDlg để nhập user và password. Nếu đúng user và pass thì sẽ hiện ra MyAppEditDlg.

    Bây giờ, nếu em chỉ include MyResource.h của em vào MyAppDlg.cpp thì biên dịch ngon lành. Nhưng nếu em tiếp tục include MyResource.h vào MyAppLoginDlg để có thể sử dụng các biến và Lớp mà em đã khai báo trong đó thì khi biên dịch lập tức sẽ xảy ra lỗi LNK 2005 và không thể chạy được ứng dụng.

    Và em đã có tham khảo lỗi LNK 2005 trong MSDN và được chỉ cách khắc phục là thêm vào Linker chỉ lệnh biên dịch /FORCE . Sau khi làm xong hướng dẫn, em biên dịch lại, chuơng trình vẫn chạy được nhưng trong Output của phần biên dịch nó vẫn xuất hiện thông báo Warning.

    Vậy em muốn hỏi là làm sao để có thể một file header chứa các biến và các lớp mà ta khởi tạo sẽ được dùng chung cho toạn bộ ứng dụng mà không bị lỗi LNK 2005.

    Có thể ở đây có bạn nói nên thêm từ khóa extern vào các biến,lớp trong file MyResource.h của em.
    Nhưng khi em thêm từ khóa extern vào:

    MyResource.h

    Code:
     extern CString Testcai


    thì khi biên dịch lại xuất hiện lỗi

    Code:
    error LNK2001: unresolved external symbol....
     fatal error LNK1120: 1 unresolved externals

    Em thật sự không hiểu tại sao như vậy? Làm thế nào để sử dụng biến, hàm, class toàn cục trong C++


    P/S : LNK 2005 : symbol already defined in object

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Lỗi vậy là quá rõ ràng rồi, vì "MyResource.h" được dịch 2 lần nên nó khai báo biến global của bạn 2 lần.

    Sử dụng extern cũng xưa như trái đất rồi nên mình sẽ giới thiệu cho bạn cách sử dụng global một cách hiệu quả dựa trên kỹ thuật singleton.

    Đầu tiên thì bạn phải biết 1 biến static sẽ là toàn cục nhưng chỉ trong file .cpp hay .h hoặc trong hàm khai báo nó.

    Tuy nhiên để public biến static này toàn cục trong project thì ta phải viết 1 lớp static nữa. static class là khái niệm của C# và Java nhưng ta hiểu đó là lớp có tất cả các hàm đều là static ví dụ như lớp ZFactory sau:

    C++ Code:
    1. // FILE: zfactory.h
    2. #pragma once
    3.  
    4. #include <iostream>
    5.  
    6. using std::string;
    7.  
    8. // struct zobject
    9. struct zobject
    10. {
    11.     int nValNo1;
    12.     int nValNo2;
    13.     int nValNo3;
    14.     int nValNo4;
    15. };
    16.  
    17.  
    18. // Factory class
    19. // Thong tin:
    20. // - Lay con tro bien toan cuc
    21. // Function
    22. // - getGlobalString: Lay con tro cua bien string toan cuc
    23. // - getGlobalObject: Lay con tro cua zobject toan cuc
    24.  
    25. class ZFactory
    26. {
    27. protected:
    28.     static string  m_globalString;
    29.     static zobject m_globalObject;
    30. public:
    31.     static string  *getGlobalString();
    32.     static zobject *getGlobalObject();
    33. };

    Bây giờ ta sẽ thực thi ở zfactory.cpp
    C++ Code:
    1. #include "ZFactory.h"
    2.  
    3. using std::wstring;
    4.  
    5. // Vi static chi hieu o 1 file khai bao no nen phai khai bao trong file .cpp
    6. string  ZFactory::m_globalString;
    7. zobject ZFactory::m_globalObject;
    8.  
    9. // Tra ve dia chi globalString
    10. string  *ZFactory::getGlobalString()
    11. {
    12.     return &ZFactory::m_globalString;
    13. }
    14.  
    15. // Tra ve dia chi globalObject
    16. zobject *ZFactory::getGlobalObject()
    17. {
    18.     return &ZFactory::m_globalObject;
    19. }
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 02-12-2008 lúc 12:30 PM.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Như vậy ở các file khác chúng ta chỉ cần #include "zfactory.h" và sử dụng.
    Ví dụ như chương trình sau:

    C++ Code:
    1. #include "stdafx.h"
    2. #include "ZFactory.h"
    3.  
    4. using std::string;
    5.  
    6. void checkGlobal()
    7. {
    8.     zobject *g_object = ZFactory::getGlobalObject();       
    9.  
    10.     std::cout << "Global string: " << ZFactory::getGlobalString()->data() << "\n";
    11.     std::cout << "Global object \n";
    12.     std::cout << "- " << g_object->nValNo1 << "\n";
    13.     std::cout << "- " << g_object->nValNo2 << "\n";
    14.     std::cout << "- " << g_object->nValNo3 << "\n";
    15.     std::cout << "- " << g_object->nValNo4 << "\n";
    16.  
    17. }
    18.  
    19. int _tmain(int argc, _TCHAR* argv[])
    20. {  
    21.     // Lay doi tuong string toan cuc
    22.     string *g_string = ZFactory::getGlobalString();
    23.     *g_string = "Hello global sring";
    24.  
    25.     // Lay doi tuong zobject toan cuc  
    26.     zobject *g_object = ZFactory::getGlobalObject();
    27.     g_object->nValNo1 = 1;
    28.     g_object->nValNo2 = 2;
    29.     g_object->nValNo3 = 3;
    30.     g_object->nValNo4 = 4;
    31.  
    32.     // in gia tri bien toan cuc!
    33.     checkGlobal();
    34.  
    35.     return 0;
    36. }
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 02-12-2008 lúc 12:34 PM.

  4. #4
    Ngày gia nhập
    11 2008
    Bài viết
    73

    Thank you! Mình cũng đã nghĩ đến cách là dùng thêm một Class để sử dụng biến toàn cục và mình đang áp dụng. Cảm ơn bạn lần nữa.

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Nếu viết thêm kiểu static class của ZC thì kid nghĩ nên bỏ vào trong 1 file .h luôn, không cần phải thêm file .cpp
    Đã được chỉnh sửa lần cuối bởi kidkid : 03-12-2008 lúc 12:58 AM.

Các đề tài tương tự

  1. Lập trình C++ Sửa lỗi giúp mình với - Thuật toán Brute Force
    Gửi bởi akiller12 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 28-08-2013, 07:02 PM
  2. Cách tạo một button mới trong lập trình Android, lỗi: "unexpected" Force close!
    Gửi bởi ICQRX trong diễn đàn Lập trình Android và Java Mobile
    Trả lời: 6
    Bài viết cuối: 04-05-2012, 11:18 AM
  3. Lỗi linker khi tạo mới project MFC
    Gửi bởi summerwind trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 03-10-2009, 10:49 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn