2012-10-31 69 views
0

我在構建解決方案時遇到了LNK2001問題。在使用我的靜態庫時出現LNK2001錯誤

該解決方案有3個項目,其中一個如果只是一個主返回0,所以我會排除它的問題。

一個項目(的SerialPort)是實現類(SerialPort)一的.lib,而其他(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:無法解析的外部符號「市民:無符號 長__thiscall的SerialPort ::的init(無符號長,字符常量*)」 (?INIT @的SerialPort @@ QAEKKPBD @ Z)

我搜索的SO答案,並沒有發現任何解決方案,治好了我的問題。

設置項目設置我遵循this msnd演練。

我也嘗試在鏈接器輸入中特別添加.lib到附加依賴項。

然後我讀this SO線程,並設置選項「將wchar_t作爲內置類型(屬性 - > C/C++ - >語言 - > ...)」仍然無效。會工作,因爲SerialPort::init被聲明爲

DWORD init (DWORD portType, LPCTSTR portName); 
  • 它認爲該故障是與使用LPCTSTR類型。

的SerialPort項目建立確定(在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中,您可以通過轉到項目> ProjectHost的項目依賴項並使SerialHost依賴於SerialPort來實現此目的。

這是假定SerialPort項目實際上包含SerialPort :: init()的定義。

+0

我做了你的建議,事實上沒有檢查SerialHost的依賴框(我認爲引用做到了這一點自動!),但它仍然沒有工作。同樣的錯誤! –

+0

你可以發佈SerialPort的代碼嗎?另外,請檢查SerialHost> Properties> Linker> General中的「鏈接庫依賴性」是否設置爲Yes。 – Angew

+0

它設置爲是。我發現了一個額外的線索,它似乎與SerialPort的init方法有關,我將發佈代碼。 –

0

的問題是在SerialPort::init(unsigned long,char const *)" ([email protected]@@[email protected])

類型LPCTSTRchar const*而不是const char*,如我所料。

因此將"COM1"參數傳遞給init引起了錯誤!我使用LPCSTR和一切工作正常。我讀了一些more和他們應該是同一件事......然後我試着將我的LPCSTRconst char*)參數設置爲LPCTSTRchar const*),它也起作用。

我仍然想要解釋爲什麼會發生這種情況,如果他們應該是相同的,所以我現在不會接受我自己的答案!

謝謝!

相關問題