zoukankan      html  css  js  c++  java
  • 完美编译运行PCRE on Windows , Solved the __imp__pcre_exec __imp__pcre_compile __imp__pcre_free Errors

    写写英文吧,好长时间不写都有点不熟练了when I compile the following codes which test the pcre , I got the unreferenced error __imp__pcre_exec __imp__pcre_compile __imp__pcre_free Errors,my Codes are follows:
    //packing pcre usual functions.
    
    #ifndef _PCRE_H_
    #define _PCRE_H_
    #include <pcre.h>
    #include <string>
    #include <vector>
    #include <string.h>
    using namespace std;
    
    const int VECSIZE = 30;
    
    struct MatchResult
    {
    	string name;
    	vector<string> value;
    };
    
    class Pcre
    {
    public:
    	Pcre();
    	~Pcre();
    
    	//Add a regrex, pass in name and regrex
    	int AddRule(const string &name, const string &patten);
    
    	//clear all the regrex
    	void ClearRules();
    
    	//match all the regrex, also return all the string match to every regrex
    	vector<MatchResult> MatchAllRule(const char content[]);
    
    private:
    	const char *error;
    	int erroffset;
    	int ovector[VECSIZE];
    	vector<pcre*> re_arr;
    	vector<string> patten_name;
    };
    #endif

    Pcre.cpp

    #include "Pcre.h"
    #include <stdio.h>
    
    Pcre::Pcre()
    {
    	re_arr.clear();
    	patten_name.clear();
    }
    
    Pcre::~Pcre()
    {
    	for(int i=0; i<re_arr.size(); i++)
            {
                    pcre_free(re_arr[i]);
            }
    }
    
    //Add a regrex patten and compile it.
    int Pcre::AddRule(const string &name, const string &patten)
    {
    	pcre *re = pcre_compile(patten.c_str(), PCRE_MULTILINE|PCRE_UTF8|PCRE_NO_AUTO_CAPTURE, &error, &erroffset, NULL);
            if(re == NULL)
            {
                    printf("pcre compile failed, offset %d: %s\n", erroffset, error);
    		return -1;
            }
    	else
    	{
    		re_arr.push_back(re);
    		patten_name.push_back(name);
    	}
    }
    
    //clear all the rule
    void Pcre::ClearRules()
    {
    	for(int i=0; i<re_arr.size(); i++)
    	{
    		pcre_free(re_arr[i]); 
    	}
    	re_arr.clear();
    	patten_name.clear();
    }
    
    //match all regrex, if any match, return the matched patten name and it's values
    vector<MatchResult> Pcre::MatchAllRule(const char content[])
    {
    	vector<MatchResult> result_arr;
    	int length = strlen(content);
    	char buf[512];
    	for(int i=0; i<re_arr.size(); i++)
    	{
    		MatchResult result;
    		result.name = patten_name[i];
    		int cur = 0;
    		int rc;
            	while(cur<length && (rc = pcre_exec(re_arr[i], NULL, content, length, cur, PCRE_NOTEMPTY, ovector, VECSIZE)) >= 0)
            	{
                    	for(int j=0; j<rc; j++)
                    	{
    				memset(buf, 0, sizeof(buf));
    				strncpy(buf, content+ovector[2*j], ovector[2*j+1]-ovector[2*j]);
                            	result.value.push_back(buf);
                    	}
                    	cur = ovector[1];
    		}
    		if(result.value.size() > 0)
    			result_arr.push_back(result);
    	}
    	return result_arr;
    }
    
    

     Main.cpp

    1>正在生成代码...
    1>正在链接...
    1>Pcre.obj : error LNK2001: 无法解析的外部符号 __imp__pcre_free
    1>Pcre.obj : error LNK2001: 无法解析的外部符号 __imp__pcre_compile
    1>Pcre.obj : error LNK2001: 无法解析的外部符号 __imp__pcre_exec
    1>.\Debug/main.exe : fatal error LNK1120: 3 个无法解析的外部命令
    1>生成日志保存在“file://E:\Test\Pcre-Test\Debug\BuildLog.htm”
    1>main - 4 个错误,7 个警告
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

     Google it , I found the thread about the error, a comment gives the solutions:

    Building under Windows:

    If you want to statically link this program against a non-dll .a file, you must
    define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
    pcre_free() exported functions will be declared __declspec(dllimport), with
    unwanted results. So in this environment, uncomment the following line. */

    //#define PCRE_STATIC

    try it ... successful !!!!


  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9410111.html
Copyright © 2011-2022 走看看