{eval=Array;=+count(Array);}

成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

問答專欄Q & A COLUMN

如何在windows上編譯linux可用的動(dòng)態(tài)鏈接庫?

glumesglumes 回答0 收藏1
收藏問題

3條回答

Jokcy

Jokcy

回答于2022-06-28 09:59

1、背景

最近的性能測(cè)試中,壓測(cè)的某些接口返回的數(shù)據(jù)是一個(gè)復(fù)雜的json格式的字符串,而后續(xù)的接口中又需要把這個(gè)字符串修改后作為入?yún)ⅲ约禾幚砥饋肀容^麻煩。于是想到了把cjson編譯成動(dòng)態(tài)鏈接庫在loadrunner的腳本中調(diào)用。另外,由于實(shí)際壓測(cè)用的是部署在linux上的負(fù)載機(jī),還需要再編譯一個(gè)linux上的動(dòng)態(tài)鏈接庫。這樣在調(diào)試時(shí)使用windows平臺(tái)的dll,而在壓測(cè)時(shí)使用linux平臺(tái)的so。 先附上我編譯好的動(dòng)態(tài)鏈接庫,可以直接在loadrunner中使用http://download.csdn.net/download/ultrahook/10126401

2、cjson

cjson是一個(gè)開源的json庫,它的優(yōu)勢(shì)在于完全用c實(shí)現(xiàn),因此適用性相當(dāng)廣,用在loadrunner中也是毫無壓力。它的git主頁是https://github.com/DaveGamble/cJSON。

3、windows平臺(tái)

  1. 打開vsual studio(我用的是vs2015,其他版本也可以,codeblock也沒問題,隨你喜歡),新建一個(gè)win32程序,程序類型選擇dll,附加選項(xiàng)選擇空項(xiàng)目。
  2. 把cJSON.c和cJSON.h拖到工程里。
  3. 設(shè)置編譯選項(xiàng)為release、x86(重要!),編譯。
  4. 將編譯出來的cjson.dll放到loadrunner腳本的根目錄下,然后在菜單File-Add file to script,添加cjson.dll。
  5. 在代碼中加載cjson.dll,然后就可以使用cjson的函數(shù)了。先嘗試一下,

    • 1
    • 2
    • 3

    注意這里cjson_Version返回的是指針,但loadrunner認(rèn)為是int,所以要顯式轉(zhuǎn)成指針,不然編譯不通過。

  6. 再看cjson解析字符串的函數(shù)。它的用法如下:

    • 1
    • 2

    這里需要用到cJSON.h中聲明的結(jié)構(gòu)體cJSON,但直接引用cJSON.h在loadrunner中編譯不過。這個(gè)也有解決辦法,把cJSON.h中cJSON這個(gè)結(jié)構(gòu)體的定義代碼復(fù)制到action的頂部就可以了,如圖 cJSON.h中其他的變量或者宏也可以,如果編譯時(shí)報(bào)錯(cuò),復(fù)制過來就可以了。

4、Linux平臺(tái)

下面再編譯一個(gè)linux平臺(tái)上的動(dòng)態(tài)鏈接庫,用在linux負(fù)載機(jī)上。 cjson的代碼中帶了MakeFile,也有cmake,可以直接編譯。但如果linux系統(tǒng)是64位的,則默認(rèn)編譯的是64位的so,無法被loadrunner加載,會(huì)提示“wrong ELF class: ELFCLASS64”。我們需要手動(dòng)修改MakeFile,讓它編譯一個(gè)32位的so。 1. 修改cJSON源碼根目錄下的MakeFile 打開MakeFile,分別在29、31、93、96行,增加-m32,如圖 2. 在源碼根目錄下執(zhí)行

  • 1
  • 2

如果出現(xiàn)提示“fatal error: sys/cdefs.h: No such file or directory”,需要再裝一個(gè)依賴庫

  • 1
  • 2

3. 編譯成功后,會(huì)得到名為libcjson.so.1.6.0的動(dòng)態(tài)鏈接庫。把它復(fù)制到loadrunner腳本的根目錄下,同樣菜單File-Add file to script,增加到腳本中。 4. 在腳本中加載so,這步和windows上是一樣的。這樣腳本就可以在linux下運(yùn)行了。linux上安裝負(fù)載機(jī)可以參考我的另一篇文章http://blog.csdn.net/ultrahook/article/details/78524182。

  • 1
  • 2

5、遺留問題

最后有個(gè)遺留問題,loadrunner似乎不支持平臺(tái)宏,我想用宏控制,在windows下加載dll,linux下加載so,但沒有找到解決方法。

評(píng)論0 贊同0
  •  加載中...
douzifly

douzifly

回答于2022-06-28 09:59

首先謝邀。

windows上的動(dòng)態(tài)鏈接庫一般是指dll文件,linux上的動(dòng)態(tài)鏈接庫一般是指so文件。

so文件是一個(gè)共享庫,用來動(dòng)態(tài)鏈接的shared object,下面示范怎么在windows平臺(tái)上編譯so文件,實(shí)質(zhì)是模擬linux使用GCC環(huán)境來編譯so文件,工具采用vs2008。

1 打開vs2008,新建一個(gè)win32的控制臺(tái)項(xiàng)目,然后新建mathunit,c和mathunit.h兩個(gè)文件,文件的內(nèi)容如下所示:

mathunits.c

  1. #include "mathunits.h"
  2. #include "time.h"
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. int add(int a,int b)
  6. {
  7. return a + b;
  8. }
  9. int sub(int a,int b)
  10. {
  11. return a - b;
  12. }
  13. void WriteSysLog(char *str)
  14. {
  15. char buf[512];
  16. long MAXLEN = 10*1024*1024;//10MB
  17. time_t timep;
  18. FILE *fp = NULL;
  19. struct tm *p;
  20. time(&timep);
  21. p = localtime(&timep);
  22. memset(buf,0,sizeof(buf));
  23. sprintf(buf,"%d-%d-%d %d:%d:%d : ",(1900+p->tm_year),(1+p->tm_mon),
  24. p->tm_mday,p->tm_hour, p->tm_min, p->tm_sec); //星期p->tm_wday
  25. strcat(buf,str);
  26. strcat(buf," ");
  27. fp = fopen("./syslog.log","r");
  28. if(fp==NULL)
  29. {
  30. fp = fopen("./syslog.log","w+");
  31. }
  32. else
  33. {
  34. fseek(fp,0,2);
  35. if(ftell(fp) >= MAXLEN)
  36. {
  37. fclose(fp);
  38. fp = fopen("./syslog.log","w+");
  39. //大于10MB則清空原日志文件
  40. }
  41. else
  42. {
  43. fclose(fp);
  44. fp = fopen("./syslog.log","a");
  45. }
  46. }
  47. fwrite(buf,1,strlen(buf),fp);
  48. fflush(fp);
  49. //fsync(fileno(fp));
  50. fclose(fp);
  51. }

mathunits.h

  1. #ifndef MATHUNITS_H
  2. #define MATHUNITS_H
  3. int add(int a,int b);
  4. int sub(int x,int y);
  5. void WriteSysLog(char *str);
  6. #endif

然后在該項(xiàng)目的主函數(shù)(main)中進(jìn)行調(diào)用測(cè)試。(注意vs2008中的main函數(shù)跟別的不太一樣)

  1. #include "stdafx.h"
  2. #include "stdlib.h"
  3. #include "mathunits.h"
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. int c = add(7,9);
  7. printf("c = %d ",c);
  8. c = sub(8,19);
  9. printf("c = %d ",c);
  10. WriteSysLog("test log out.");
  11. system("pause");
  12. return 0;
  13. }

在編譯開始之前要將vs2008設(shè)為C的編譯。下面使用GCC進(jìn)行編譯:

1 運(yùn)行CyqWin.bat設(shè)置編譯路徑到上面mathunits.h和mathunits.c目錄。

2 將.c文件編譯為.o文件 gcc -c mathunits.c


3 接著將o文件進(jìn)行打so文件 gcc -shared -fPCI -o libdyunits.so mathunits.o

評(píng)論0 贊同0
  •  加載中...
piglei

piglei

回答于2022-06-28 09:59

起碼得有個(gè)GCC吧

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長該話題
  • 回答過該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<