2014-02-06 49 views
0

在Windows x86下爲MS VC++構建的pcre-8.34,將libs(pcrecpp.lib)和頭文件(pcrecpp.h,pcrecpparg.h,pcre_stringpiece.h)複製到它們的位置,並希望測試一個簡單的代碼(即在GNU Linux下C++的作品),但我得到了一些鏈接錯誤:MS VC++ 9 pcrecpp.lib鏈接錯誤

#define PCRE_STATIC 1 

#include <pcrecpp.h> 
#include <iostream> 

#pragma comment(lib,"pcrecpp.lib") 

using namespace std; 

int main(void) 
{ 
    pcrecpp::RE regex("(hello)"); 
    std::string strBase = "hello hello hello"; 

    pcrecpp::StringPiece input(strBase); 

    std::string match; 

    int count = 0; 
    while (regex.FindAndConsume(&input, &match)) { 
    count++; 
    std::cout << count << " " << match << std::endl; 
    } 
} 

大廈輸出:

C:\ Documents和Settings \管理員\桌面\編碼\ pcre> cl.exe/MD /EHsc/O2 pc.cpp Microsoft(R)32位C/C++優化編譯器 版本15.00.21022.08 for 80x86版權所有(C)Microsoft Corporation。 保留所有權利。

pc.cpp Microsoft(R)Incremental Linker版本9.00.21022.08 版權所有(C)Microsoft Corporation。版權所有。

/out:pc.exe pc.obj pcrecpp.lib(pcrecpp.obj):錯誤LNK2019: 解析的外部符號_pcre_compi勒在功能 引用「私人:結構real_pcre * __thiscall pcrecpp :: RE中:C ompile (enum pcrecpp :: RE :: Anchor)「(?編譯@ RE @ pcrecpp @@ AAEPAUreal_pcre @@ W4Ancho r @ 12 @@ Z)pcrecpp.lib(pcrecpp.obj):錯誤LNK2019:無法解析的外部 符號_pcre_confi g參考函數「int __cdecl pcrecpp :: NewlineMode(int)」(?NewlineMode @ p crecpp @@ YAHH @ Z) pcrecpp.lib(pcrecpp.obj):error LNK2019:無法解析的外部符號 _pcre_exec在函數「 private:int __thiscall pcrecpp :: RE :: TryMatch(class pcre cpp :: StringP (int),枚舉 pcrecpp :: RE :: Anchor,bool,int *,int)const「(?T ryMatch @ RE @ pcrecpp @@ ABEHABVStringPiece @ 2 @ HW4Anchor @ 12 @ _NPAHH @ Z) pcrecpp .lib(pcrecpp.obj):error LNK2019:無法解析的外部符號 _pcre_fulli在函數「public:int __thiscall pcrecpp :: RE :: NumberOfCapturin gGroups(void)const」中引用的nfo (?NumberOfCapturingGroups @ RE @ pcrecpp @@ QBEHXZ) pcrecpp.lib(pcrecpp.obj) :錯誤LNK2019:無法解析的外部符號_pcre_free在 中引用函數「private:void __thiscall pcrecpp :: RE :: Cleanup(void)」(?C leanup @ RE @ pcrecpp @@ AAEXXZ) pc.exe:致命錯誤LNK1120:5無法解析 外部設備

任何想法我做錯了什麼?在VC++ 10下也嘗試過,同樣的錯誤。 我應該包括<pcre.h>#pragma comment(lib,"pcre.lib"),因爲如果我這樣做,鏈接發生時沒有任何錯誤,但在C++代碼中使用C頭和庫似乎很奇怪?

UPDATE:

我這樣做,現在的作品,唯一的問題是:這是正確的C++?

#define PCRE_STATIC 1 

#include <pcrecpp.h> 
#include <iostream> 

#pragma comment(lib,"pcrecpp.lib") 
#pragma comment(lib,"pcre.lib") 

using namespace std; 

int main(void) 
{ 
    pcrecpp::RE regex("(hello)"); 
    std::string strBase = "hello hello hello"; 

    pcrecpp::StringPiece input(strBase); 

    std::string match; 

    int count = 0; 
    while (regex.FindAndConsume(&input, &match)) { 
    count++; 
    std::cout << count << " " << match << std::endl; 
    } 
} 

輸出:

C:\ Documents和Settings \管理員\編碼\ PCRE> cl.exe時/ O2/MD /EHSC pcc.cpp /鏈接/ SUBSYSTEM:CONSOLE KERNEL32.LIB User32.lib Wininet.lib pcre.lib Microsoft(R)32位C/C++優化編譯器 版本15.00.21022.08(適用於80x86)版權所有(C)Microsoft Corporation。 保留所有權利。

pc.cpp Microsoft(R)Incremental Linker版本9.00.21022.08 版權所有(C)Microsoft Corporation。版權所有。

/out:pc.exe /子系統:CONSOLE KERNEL32.LIB USER32.LIB Wininet.lib pcre.lib get_all_proc.obj

+0

你確定你的「pcre,lib」是否構建正確?它似乎不包含所需功能的執行等。 –

+0

如果我鏈接到'pcrecpp.lib'不起作用,但如果我將它與'pcre.lib'鏈接它也可以。我試過一個預編譯的靜態庫也有相同的結果。 – bsteo

回答

0

你還需要對 「pcre.lib」 鏈接。如果你看看「pcrecpp.h」源代碼,你會發現它包含「pcre.h」,所以它也使用庫的「c部分」。

+0

是的,我這樣做,工作,所以可以用C++ – bsteo