Ошибки при компоновке 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 шт):
Первые ошибки были из-за того, что вы определения функций записали в хедер файл. При повторному обращению возникает ошибка, что вы создаёте функцию с таким-же именем.
Эти функции нужно записать в отдельный .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 );
}
}
Для тех кто первый арз сталкивается я трудностми в многофайловом проекте рекомендую посмотреть это видео
