如何在S60項目中調用標準C/C++的庫函數

 

標題有點長,但還是能看明白的吧。

最近做一個S60項目,需要自己設計列表控件,滾動條和分頁都要從頭開始模擬,比較頭疼。

在做分頁時不免需要用到ceil()函數,而Symbian的Class Math沒有提供ceil()函數,於是只能藉助標準C。

藉此機會說明一下如何在S60項目中使用標準C的庫函數。

 

1.SDK文檔中查知ceil:

Location: libc/math.h

ceil()

IMPORT_C double ceil(double);

 

2.打開工程的mmp文件,在SYSTEMINCLUDE 項後面添加/epoc32/include/libc,保存mmp

 

3.調用ceil的cpp文件中 #include <libc/math.h>

(#include <math.h>也是可以的)

 

4.完成如下調用:

double a = ceil(50.0 / 24); //a==3.0000000

 

題外話:

雖然Math類沒有提供Ceil()函數,但是我們可以利用Math::DivMod64 / Math::UDivMod64函數進行模擬。

實現如下:

TInt64 mod; //用來保存餘數

TInt a = Math::DivMod64(50,24,mod); // a== 2 , mod==2

TInt ceilValue = mod > 0? a + 1 : a; //ceilValue==3

 

 

STL for Symbian C++

http://whyandroid.com/symbian/66-stl-for-symbian-c.html

 

- Download OpenC/C++ Plugin

 

- Install it

 

- Modify the mmp file

 

That's all to use STL for Symbian C++

 

(The section below is copied from the help file of Nokia (The Standard C++ API Reference))

 

 

 

Changes to the MMP file

 

Add needed libraries used by the MMP file structure:

If developers want to use any of the Standard C++ library, they need to link to the corresponding library in the MMP file using the LIBRARY keyword.

 

If the application has main() as the entry point, the library libcrt0.lib must be specified as the first library otherwise, it will result in linker errors. The user must link to the Symbian OS euser.dll. This is required since the static library uses some of the services of the Symbian OS such as creating cleanup stack, and having a top level TRAP. All these details are hidden from the developer. The developer will write the application as if it were for the UNIX environment.

 

 STATICLIBRARY  libcrt0.lib

LIBRARY        libc.lib 

LIBRARY        euser.lib  // Needed in order to use Symbian services

The libcrt0.lib library is required if we are not going to write E32Main within our application (EXE). This static library has an implementation of E32Main within which it calls the library initialization method followed by calling main written by the developer. This static library also gets command-line arguments and passes the same to main.

 

 

 

If the application has E32Main() as an entry point, there is no need to link to libcrt0.lib like in the example below.

 

LIBRARY         libc.lib 

LIBRARY         euser.lib

Add needed include paths

 

 SYSTEMINCLUDE   /epoc32/include/stdapis

SYSTEMINCLUDE   /epoc32/include/stdapis/sys

SYSTEMINCLUDE   /epoc32/include/stdapis/stlport 

Linking of libstdcpp

 

The following snippet shows how to perform the linking to libstdcpp on an emulator:

 

 #ifdef EPOC32

LIBRARY  libstdcpp.lib

#else

FIRSTLIB ../udeb/libstdcpp.lib

STATICLIBRARY    eexe.lib 

#endif

Add the below option and macro in the MMP file

 

 //This is required even if the wchar type is not used.

OPTION CW -wchar_t on 

MACRO  _WCHAR_T_DECLARED

NOTE: Standard C++ applications may require more stack space. The recommended stack size is 10K. To set the stack size to 10K add:

EPOCSTACKSIZE 0x10000

in the MMP file.

 

 

Example using main()

 

A simple example using main() as an entry point is described below. The example writes a text to a console.

Modify the MMP file as mentioned before.

Do usual C++ style coding.

 //  Include Files  

#include <iostream>

#include <cstring>

 

// This is a GCCE toolchain workaround needed when compiling with GCCE

// and using main() entry point

#ifdef __GCCE__

 

#include <staticlibinit_gcce.h>

#endif

 

using namespace std;

 

class myclass {

public:

  void show(){cout<<"Hello World/n"; }

} ;

 

int main()

{

  myclass obj;

  obj.show();

  cout<<"Press a character to exit!";

  int c = getchar();

  return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章