2015年10月13日 星期二

使用printf印出有顏色的Console訊息

有時候Console訊息很多,如果能把自己想看的訊息加點顏色,可以加快Debug速度

下面記錄了一個基於printf可以印出彩色訊息的function。

====================================================================
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define NONECOLOR "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
#define GREEN "\033[0;32;32m"
#define LIGHT_GREEN "\033[1;32m"
#define BLUE "\033[0;32;34m"
#define LIGHT_BLUE "\033[1;34m"
#define DARY_GRAY "\033[1;30m"
#define CYAN "\033[0;36m"
#define LIGHT_CYAN "\033[1;36m"
#define PURPLE "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN "\033[0;33m"
#define YELLOW "\033[1;33m"
#define LIGHT_GRAY "\033[0;37m"
#define WHITE "\033[1;37m"


//**********************************************************
// Usage Example:
// int num=7;
// COLOR_DBG("%s Lucky Number is %d", GREEN, num);     
//
// Description:
// This message will show Green color.
//
// viod COLOR_DBG(const char* Format, const char* Color, const char* str, ...)
void COLOR_DBG(const char* Format, ...)
{
char str[255];
va_list ap;
va_start(ap,Format);
vsprintf(str,Format,ap);
sprintf(str,"%s%s",str,NONECOLOR);
printf("%s",str);
va_end(ap);
}


int main()
{
COLOR_DBG("%s Hello World!!!!!\n", YELLOW);
return 0;
}
=====================================================================

以下是使用gcc compiler後執行結果的截圖!


2015年10月7日 星期三

將C++的function包裝成Library(so檔)給C的程式使用

今天要練習的是,把C++的Function包給C程式使用時該怎麼作

首先我們先撰寫一支簡單的C++程式,如下所示
////////////////////  cplus_lib.cpp  ////////////////////////
#include <iostream>
using std::cout;

void cout_func()
{
cout << "Hello World!\n";
}
//////////////////////////////////////////////////////////////////

接著我們將她打包成動態連結檔libcplus_lib.so,步驟如下:
1. gcc -Wall -O2 -c -o cplus_lib.o cplus_lib.cpp
2. gcc -shared -o libcplus_lib.so cplus_lib.o

經過以上兩個步驟,我們可以得到動態連結檔的函式庫 libcplus_lib.so






接著我們試著再寫一支C程式,此程式去使用函式庫的cout_func()來印出"Hello World"
///////////////////////  main_cout.c  //////////////////////////////
#include <stdio.h>

int main()
{
        cout_func();
        return 0;
}
/////////////////////////////////////////////////////////////////////////////

接著編譯過程如下,注意要額外指定C++ 標準函式庫 libstdc++:
1.gcc -o main_cout_dynamic main_cout.c -L. -lcplus_lib -lstdc++

結果會出下以下的錯誤訊息:












解決方法,要在產生library的程式當中加入一些東西,如下所示:
////////////////////  cplus_lib.cpp  ////////////////////////
#include <iostream>
using std::cout;

#ifdef __cplusplus
extern "C" {
#endif
void cout_func()
{
cout << "Hello World!\n";
}
#ifdef __cplusplus
}
#endif
//////////////////////////////////////////////////////////////////
註:上面程式碼的意思是: 如果這是一段cpp的程式碼,就加入extern "C"{} 來處理其中的程式碼


這樣子編譯器才看得懂,所以再整個重新編譯一次,就成功了!
















註: 上圖第三行,作者把產生出來的library複製到library環境變數的預設路徑下,如果不這樣作,當執行main_cout_dymanic時,會出現找不到library的錯誤訊息,關於這部分作者正在尋找可以自己指定吃特定路徑的library的方法.....

如果有朋友知道方法,也請給予指教,謝謝!