Ошибка LNK2001 при использовании моей статической библиотеки

У меня проблемы с 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);
  • он думал, что ошибка была с использованием типа LPCTSTR.

Последовательный порт Проект строит ОК ( 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;
}

0

Решение

Похоже, что SerialHost не связывает SerialPort. В VS 2008 вы могли бы достичь этого, перейдя в Project> Project Dependencies для SerialHost и сделав SerialHost зависимым от SerialPort.

Это предполагает, что проект SerialPort на самом деле содержит определение SerialPort :: init ().

0

Другие решения

Проблема была в SerialPort::init(unsigned long,char const *)" (?init@SerialPort@@QAEKKPBD@Z)

Тип LPCTSTR является char const* вместо const char*, как я и предполагал.

Следовательно, передавая "COM1" параметр для init вызвал ошибку!

я использовал LPCSTR и все работало нормально. Я читаю некоторые Больше и они якобы то же самое … Тогда я попытался бросить LPCSTR (const char*) параметр к LPCTSTR (char const*) и это тоже сработало.

Я все еще хотел бы пролить свет на то, почему это происходит, если они должны быть одинаковыми, поэтому я не приму свой собственный ответ прямо сейчас!

Спасибо!

0