У меня проблемы с LNK2001 при создании решения.
В решении есть 3 проекта, один из которых — основной, который возвращает 0, поэтому я исключу его из проблемы.
Один проект (Последовательный порт) .lib, который реализует класс (SerialPort
), а другой (SerialHost) просто создает экземпляр SerialPort
,
Я думаю, что проблема где-то в настройках проекта SerialHost. Здесь идет SerialHost код проекта:
#include "SerialPort.h"
int main (int argc, char *argv[])
{
SerialPort* serialHost = new SerialPort();
serialHost->init(PORT_HOST,"COM1");
delete serialhost;
return 0;
}
И доходность здания:
main.obj: ошибка LNK2001: неразрешенный внешний символ «public: unsigned
long __thiscall SerialPort :: init (unsigned long, char const *) «(? init @ SerialPort @@ QAEKKPBD @ Z)
Я искал ответы так и не нашел решения, которое вылечило бы мою проблему.
Чтобы установить настройки проекта я следовал этот MSnd прохождение.
Я также попытался добавить именно .lib к дополнительным зависимостям в Linker-Input.
Потом читаю этот SO thread, и установка опции «Обрабатывать wchar_t как встроенный тип (Properties-> C / C ++ -> Language-> …) в No все еще не работала. Я думал, что это будет работать, потому что SerialPort::init
объявлен как
DWORD init (DWORD portType, LPCTSTR portName);
Последовательный порт Проект строит ОК ( init
метод реализован в .cpp).
Я только начинаю работать с моими собственными статическими библиотеками в VS, поэтому, возможно, я делаю здесь некоторые основные ошибки.
Заранее спасибо за вашу помощь!
Дополнительная информация:
Я пытался закомментировать init
и используя другой метод, и он построен просто отлично! Этот код:
int main (int argc, char *argv[])
{
SerialPort* serialHost = new SerialPort();
serialHost->init(PORT_HOST,"COM1");
serialHost->runTerminal();
return 0;
}
в SerialHost просто выдает ошибку в init
— если я прокомментирую init
, ошибки связывания не появляются.
Вот реализация для SerialPort
// SerialPort.h
#pragma once
#include <windows.h>
#include <iostream>
#define READ_BUFFER_SIZE 1
#define PORT_BAUD_RATE CBR_9600
#define PORT_PARITY NOPARITY
#define PORT_BYTE_SIZE 8
#define PORT_STOP_BITS ONESTOPBIT
#define PORT_HOST 0
#define PORT_DEVICE 1
class SerialPort
{
public:
SerialPort (void);
virtual ~SerialPort (void);
DWORD init (DWORD portType, LPCTSTR portName);
DWORD runTerminal (void);
DWORD runDevice (void);
LPCTSTR getVersion (void);
protected:
// Port properties
HANDLE _hSerialComm;
// Buffers
DWORD _dwBytesRead;
DWORD _dwEvtCodeRecvd;
std::string _inputString;
DWORD _eventNum;
COMSTAT _portStats;
COMMCONFIG _portDefaultConfig;
DCB _portCfgDCB;
std::string _version;
DWORD configureSerialPort (LPCTSTR portName, DWORD portType);
DWORD resetPortCfg (LPCTSTR portName);
HANDLE openPort (LPCTSTR portName, DWORD accessFlags);
DWORD configureDCB (HANDLE hSerialPort);
DWORD configureCommMask (HANDLE hSerialPort);
DWORD configureTimeOuts (HANDLE hSerialPort);
DWORD clearPortIO (HANDLE hSerialPort);
VOID printPortConfig (DCB portCfgDCB, LPCTSTR portName);
VOID printPortErrors (DWORD portErrors, COMSTAT portStats);
DWORD checkCommErrors (HANDLE hSerialPort);
};
// SerialPort.cpp - just init method
DWORD SerialPort::init(DWORD portType,LPCTSTR portName)
{
_hSerialComm = NULL;
_dwBytesRead = 0;
_dwEvtCodeRecvd = 0;
_eventNum = 0;
memset(&_portStats,0,sizeof(_portStats));
memset(&_portDefaultConfig,0,sizeof(_portDefaultConfig));
memset(&_portCfgDCB,0,sizeof(_portCfgDCB));
// Configure Serial Port
configureSerialPort(portName,portType);
return 1;
}
Похоже, что SerialHost не связывает SerialPort. В VS 2008 вы могли бы достичь этого, перейдя в Project> Project Dependencies для SerialHost и сделав SerialHost зависимым от SerialPort.
Это предполагает, что проект SerialPort на самом деле содержит определение SerialPort :: init ().
Проблема была в SerialPort::init(unsigned long,char const *)" (?init@SerialPort@@QAEKKPBD@Z)
Тип LPCTSTR
является char const*
вместо const char*
, как я и предполагал.
Следовательно, передавая "COM1"
параметр для init
вызвал ошибку!
я использовал LPCSTR
и все работало нормально. Я читаю некоторые Больше и они якобы то же самое … Тогда я попытался бросить LPCSTR
(const char*
) параметр к LPCTSTR
(char const*
) и это тоже сработало.
Я все еще хотел бы пролить свет на то, почему это происходит, если они должны быть одинаковыми, поэтому я не приму свой собственный ответ прямо сейчас!
Спасибо!