我們的網管平台基於ace, odbc,snmp ++的,都是可以跨平台的庫,但一直未進行linux下的編譯測試,這是去年移植測試時記錄的日誌。
注意移植前先要編譯好ace, unixodbc,snmp ++的庫。
在從vc下移植到linux(用gcc編譯)過程中記錄的一些更改項:
1)微軟windef.h檔案中定義的內容linux下不可用,包括
#define max_path
260別的還有
#define dword unsigned int
#define lpvoid void*
2)用到的ace中和nt有關的
ace_nt_service
這些東西即使是win32下其實也沒有起作用,直接遮蔽
3)微軟winsvc.h檔案中定義的內容
#define service_control_shutdown
0x00000005
.....
這些東西即使是win32下其實也沒有起作用,直接遮蔽
4)有些大小寫有關係了, 還有include後面必須用/而不是/
#include "ace/os.h"
#include "ace/task.h"
#include "dbaccess1.h"
#include "include/v3.h"
#include "include/snmpmsg.h"
// asn serialization class
#include "include/vb.h"
#include "include/oid_def.h"
5)有些語法細節gcc不允許
ace_debug((lm_info, ace_text("%d preparing to rebuild db connection "
"pool(%d)! : %t/n"), iconnpoolsize));
那個換行的第二個"必須放到第二行
6)每個檔案結尾都要回車,不然編譯會告警
warning: no newline at end of file
7)gcc不允許過期繫結(vc下是可以通過編譯的)
for (int i = 0;i < 6;i++)
。。。for (i = 0;i < 128;i++)
8)warning: "null" redefined
9)linux(gcc)下函式至少返回void,vc下不是必須的
10) 登錄檔部分只能在windows中用(查詢資料庫型別)
改用sqlgetinfo讀資料庫型別
11)formatmessage這是mfc cstring的東東(comm.cpp 裡面得debug_info函式)
12)linux下用真實ip得出來的主機名和用127.0.0.1或0.0.0.0(預設)得出來得不一樣
ace_inet_addr addr1(port, szaddr);//初始化,注意第二個引數填真實ip和"127.0.0.1"的區別
addr1.get_host_name();//獲得主機名
13)常量字串不能直接轉給char*
sztemp = (sztemp==0||strlen(sztemp)<1)?" ":sztemp;
14)linux不支援:itoa
strrev strnicmp(不管大小寫的比較) stricmp strset sleep
其中itoa用ace_os::itoa代替(strrev也就不用了),可以用以下函式模擬實現或轉換成linux下的函式
#if
defined(__linux__)
#define
max_path
260
#define
dword
unsigned
int
#define
lpvoid
void*
#define
strnicmp
strncasecmp
#define
stricmp
strcasecmp
typedef unsigned
char
byte;
typedef unsigned
short
word;
#define
__strrev
strrev
char
* strrev
(char
* szt)
return
szt; }
#define
_itoa
itoa
char
* itoa
(int
value
, char
* str
, int
radix)
} }
if(
'!'== ch)
else
}while(
value
!= 0 );
str[
pos] =
'/0';
return
strrev
(str);
} inline void
sleep
(unsigned
intuseconds)
#endif
預設庫路徑怎麼不起作用呢(bvrde裡面)?
export ace_root
c_include_path=$ace_root
export c_include_path
共享庫ld_library_path=$ace_root/ace;$ld_library_path
export ld_library_path
靜態庫library_path=./snmp_lib/lib
export library_path
後來在makefile裡面明確指定庫檔案(給ld選項使用,編譯多專案檔案的單個檔案時只需指定-i路徑即可)才行:
libs
= ./snmp_lib/lib/libsnmp++.a /
./snmp_lib/libdes/libdes.a /
/usr/lib/libodbc.so
arm平台linux移植ethtool工具
1.git.kernel.org pub scm network ethtool ethtool.git 2.tar xzf ethtool 3.15.tar.gz cd ethtool 3.15 3.原始碼中是沒有configure檔案的首先要編譯生成該檔案 4.依次執行 aclocal auto...
php平台移植windows和linux
2015 1 14 今天專案中遇到乙個問題,在本地執行沒有問題,掛到伺服器上,就執行錯誤。過程中比較粗心,知道導致這樣的原因,居然小時漏掉了一些細節。比如,在php中通過宣告 autoload 方法可以自動載入相關類。而在windows和linux中有乙個比較大的區別,那就是linux是大小寫區分的...
Windows 程式移植到Linux平台的一波N折
本人前端時間寫了個html檔案分析器,windows平台上的vc6.0,使用標準c 昨天接到指令,應要求要發布乙個linux版本的,茫然啦,linux下面的hello world都沒有玩過,對linux下的c 程式僅僅限於聽他們神吹過的gcc,g makefile什麼的,其他一概不知。這就注定移植過...