linux到windows移植

NO IMAGE

windows下一般建的是控制檯應用程式,由於使用的庫都是跨平臺庫的,所以移植起來也比較輕鬆。

問題:msvcprtd.lib(MSVCP90D.dll) : error LNK2005: “public: __thiscall std::basic_string
解決方法(alglib表示你使用的某一個庫):This is more of a conflict between alglib and the STL. Alglib uses the STL string and when linking it to part of your code which uses string then it will find another set of objects for string and come up with a problem.
If you are sure that alglib was built using the same version of the compiler that you are using then there is a way around it, but I’m hesitant because it can cause problems. But the thing you can try is to set the linker to allow multiply defined symbols. 
You can set this by going to Project 
Properties->Configuration Properties->Linker->Command Line and in the Additional Options box type /FORCE:MULTIPLE.
This isn’t something I recommend though, so do testing to make sure that it works fine.

注意對lib的使用,如:
apr
boost
openssl
tbb
xercesc
zlibc
1.動態庫:編譯的時候需要.h, .lib, 執行的時候要.dll,注意路徑;
2.靜態庫:編譯和執行只需要.h, .lib。
配置屬性->C/C ->前處理器->前處理器定義:程式碼中用到的預編譯巨集;
配置屬性->C/C ->常規->附加包含目錄:引用庫的標頭檔案路徑;
配置屬性->連結器->常規->附加庫目錄:庫(.lib)所在的目錄;
配置屬性->連結器->輸入->附加依賴項:庫的名字(如:log4cxx.lib);
執行時dll需要放在工程目錄下或者可執行程式的目錄或者系統目錄下。
error LNK2019: 無法解析的外部符號,對庫的使用不正確造成的。

標頭檔案, 函式的不同,可以用如下巨集,預處理:
#ifdef WIN32
  // windows handle
#elif __linux__
  // linux handle
#else
  // others handle
#endif

如果兩個函式引數和返回值都相同時,如在windows下沒有sleep,會使用巨集裡面定義的Sleep。
在linux下由於定義了sleep這樣就不會用到這個巨集了,它會呼叫linux下的sleep函式。
#ifndef sleep
#define sleep(seconds) (Sleep((seconds)*1000))
#endif

windows        替代     linux
localtime_s             localtime_r
inet_addr               inet_pton
GetTickCount            GetTickCount
Sleep毫秒               sleep秒
_mkdir                  mkdir
memset                  bzero
_fullpath               realpath

注意linux、windows下讀取的檔案格式問題:
在windows下讀取配置檔案失敗,
可能配置檔案格式不正確,將utf8改為GB2312;