Ошибки при компоновке cpp фалов в проекте

При сборке проекта возникли ошибки при компоновке файлов. В чём может быть ошибка?

Ошибки: Ошибки при сборке проекта

Проект содержит следующие файлы с кодом:

Source.cpp

#include "COMProcess.h"
int main()
{
    char a[] = "COM3";
    OpenCom(a);
    WriteCom("3", 1);
    while (true)
    {
        ReadCOM();
    }
    return 0;
}

COMProcess.h

#include <Windows.h>
#include <iostream>

extern HANDLE hSerial;

void ReadCOM()
{
    DWORD iSize;
    char sReceivedChar;
    while (true)
    {
        ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
        if (iSize > 0)   // если что-то принято, выводим
            std::cout << sReceivedChar;
    }
}

DWORD WriteCom(const char* msg, int sizeMsg) {
    DWORD dwBytesWritten;    // тут будет количество собственно переданных байт
    BOOL iRet = WriteFile(hSerial, msg, sizeMsg, &dwBytesWritten, NULL);
    return dwBytesWritten;
}

void OpenCom(const char* msg) {
    size_t newsize = strlen(msg) + 1;
    wchar_t* port = new wchar_t[newsize];
    size_t convertedChars = 0;
    mbstowcs_s(&convertedChars, port, newsize, msg, _TRUNCATE);

    LPCTSTR portName = port;
    hSerial = ::CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (hSerial == INVALID_HANDLE_VALUE)
    {
        if (GetLastError() == ERROR_FILE_NOT_FOUND)
        {
            std::cout << "serial port does not exist.\n";
        }
        std::cout << "some other error occurred.\n";
    }
    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
        std::cout << "getting state error\n";
    }
    dcbSerialParams.BaudRate = CBR_9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (!SetCommState(hSerial, &dcbSerialParams))
    {
        std::cout << "error setting serial port state\n";
    }
}

Насколько понял, данная ошибка возникла из-за использования глобальной переменной extern HANDLE hSerial;. Логично было бы передовать её из функции в функцию, но как можно исправить эти ошибки без таких методик?


Ответы (2 шт):

Автор решения: AlexGlebe

Первые ошибки были из-за того, что вы определения функций записали в хедер файл. При повторному обращению возникает ошибка, что вы создаёте функцию с таким-же именем.

Эти функции нужно записать в отдельный .cpp файл. А в хедере оставить только предварительные объявления.

void OpenCom(const char* msg);
DWORD WriteCom(const char* msg, int sizeMsg);
void ReadCOM(void);    

Вторая ошибка из-за декларации extern HANDLE hSerial; которая намекает компилятору, что существует переменная где-либо в коде.

Но вы не определили нигде переменную HANDLE hSerial;, например в Source.cpp файле и по-этому компилятор не может её найти.


При одновременном стучании на разные порты будут большие проблемы из-за одной глобальной переменной extern HANDLE hSerial;

Правильнее передавать это значение аргументом. Примерно так :

HANDLE OpenCom(const char* msg);
DWORD WriteCom(HANDLE,const char* msg, int sizeMsg);
void ReadCOM(HANDLE);

И пользоваться простой локальной переменной :

#include "COMProcess.h"
int main(){
    char a[] = "COM3";
    HANDLE const h = OpenCom(a);
    WriteCom( h ,"3", 1);
    while (true) {
        ReadCOM( h );
    }
}
→ Ссылка
Автор решения: Евгений Ягодкин

Для тех кто первый арз сталкивается я трудностми в многофайловом проекте рекомендую посмотреть это видео

→ Ссылка