2007年1月18日 星期四

如何在 .NET 環境下編譯 CRF++

請依照下列的步驟:

  1. 將原始碼匯入後,在 project property settting 內設定: C/C++ → Precompiled Header → Create/Use Precompiled Header,將其設定為“Not Using Precompiled Header”
  2. 定義下列的標頭(自行 include 建立的標頭檔,或是將該標頭檔命名為 config.h,並加入 HAVE_CONFIG_H 的前處理器定義):
    • #define VERSION "0.43"
    • #define PACKAGE "crf++"
  3. 定義前處理器定義(Preprocessor Definitions):
    • HAVE_WINDOWS_H
    • _WIN32
  4. 最後,對於 crf_test 而言,若是你的程式碼遇到了 CreateFile 失敗的錯誤訊息,請在 mmap.h 原始碼中加上如下的轉換(約在 117 行):
// add by hongjie to convert char* string to LPCWSTR
int len = strlen(filename) + 1;
wchar_t *ucString = new wchar_t[len];
mbstowcs(ucString, filename, len);

hFile = CreateFile(ucString, mode1, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// marked by hongjie
/*hFile = CreateFile(filename, mode1, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);*/

64 位元?

編譯成 64 bit 時,若是產生 << 錯誤,請開啟 common.h 檔,並加入:

string_buffer& operator<<(size_t _n) { _UITOA(_n); }

當掉的原因列表

  1. 首先,請嘗試在產生的 feature file 尾端,加上三行空白,再去 train
  2. 檢查是否是記憶體不足的問題。
    • 若是在 64 位元電腦,請參考這篇文章
    • 若是在 32 位元的電腦上,且用的記憶體超過 2G,則必須在編譯時的 linker 選項中,加上 Enable Large Addresses 支援!另外要在開機選項中加上:
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3GB