c++compiler-errorsmac-address

Get MAC address on Windows


I am trying to get MAC address on my Windows PC but I have been facing an error when trying to convert it to string.

This is my code:

string UniqueKeyGenerator::getMacAddress () {
    try {
      IP_ADAPTER_INFO adapterInfo[16];
      DWORD bufLen = sizeof(adapterInfo);
      string adapter;
      string mac_address;

      // Get the adapter info
      DWORD dwStatus = GetAdaptersInfo(adapterInfo, &bufLen);
      if (dwStatus != ERROR_SUCCESS) {
          std::cerr << "GetAdaptersInfo failed with error " << dwStatus << std::endl;
          return "";
      }

      // Iterate over the adapters and display the MAC addresses
      PIP_ADAPTER_INFO pAdapterInfo = adapterInfo;
      while (pAdapterInfo) {
          adapter = pAdapterInfo->AdapterName;
          std::cout << "Adapter: " << adapter << std::endl;

          // Skip empty MAC addresses
          if (pAdapterInfo->Address[0] == 0) {
              std::cerr << "Empty MAC address for adapter: " << adapter << std::endl;
          } else {
              mac_address = macAddressToString(pAdapterInfo->Address);
              std::cout << "MAC Address: " << mac_address << std::endl;
              return mac_address; // Return the first MAC address found
          }

          pAdapterInfo = pAdapterInfo->Next;
      }
      return "Mac address not found";
     
    } catch (const exception& e) {
      cerr<<"Exception in: "<< e.what() <<endl;
      return e.what();
    }
    
  }

  std::string macAddressToString(const BYTE* macAddr) {
   char macStr[18];
    snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", 
             macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
    return std::string(macStr); 
  }

The error occurs at line:

mac_address = macAddressToString(pAdapterInfo->Address);

that function returns only "".

This is the error:

FAILED: lv.exe 
C:\WINDOWS\system32\cmd.exe /C "cd . && C:\PROGRA~1\LLVM\bin\CLANG_~1.EXE -nostartfiles -nostdlib -O0 -g -Xclang -gcodeview -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -Xlinker /subsystem:cons
ole  -fuse-ld=lld-link CMakeFiles/lv.dir/main.cpp.obj -o lv.exe -Xlinker /MANIFEST:EMBED -Xlinker /implib:lv.lib -Xlinker /pdb:lv.pdb -Xlinker /version:0.0   LicenseVerifier.lib  -lkernel32 -luser32 -lg
di32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -loldnames  && cd ."
lld-link: error: undefined symbol: private: class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> __cdecl LicenseVerifier::UniqueKeyGenerator::macAddressToString(unsig
ned char const *)
>>> referenced by C:\Users\Do Duy Manh\Desktop\manh\tasks\license_verifier_c_cpp\license_verifier_c_cpp\src\UniqueKeyGenerator.cpp:103
>>>               CMakeFiles/lv.dir/main.cpp.obj:(private: class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> __cdecl LicenseVerifier::UniqueKeyGenerator::getMacAdd
ress(void))
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

Solution

  • You are getting a linker error. Your linker cant find the implementation code for the function you are trying to call.

    The error says it can't find UniqueKeyGenerator::macAddressToString() but the implementation of macAddressToString() you have shown is not a member of UniqueKeyGenerator.

    It seems that you likely declared macAddressToString() as a member of UniqueKeyGenerator, but you did not define it as a member, like you did with getMacAddress(). Try adding that qualification to your function's definition:

      std::string UniqueKeyGenerator::macAddressToString(const BYTE* macAddr) {
                //^^^^^^^^^^^^^^^^^^^^
       char macStr[18];
        snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", 
                 macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
        return std::string(macStr); 
      }