|Code| 如何在 C++ 程式使用 C api ?

C++ 可以引用其他 C語言寫的 api,這不意外。

但要怎麼做?

C++:

請在把要使用的 C api 的 header 用 extern “C” 包起來

extern "C"
{
#include "demo_c_api_A.h"
#include "demo_c_api_B.h"
}

 

而要被使用的 C api 的 header:

demo_c_api_A.h:

#ifndef DEMO_C_API_A_H
#define DEMO_C_API_A_H

#include "aaa.h"
#include <bbb.h>

#ifdef __cplusplus
extern "C"
{
#endif

...

(C 的 header 原本該寫的東西)

...

#ifdef __cplusplus
}
#endif

#endif

 

你也可以不要直接用 extern 標全部,單獨寫:

#ifndef DEMO_C_API_A_H
#define DEMO_C_API_A_H

#include "aaa.h"
#include <bbb.h>

extern int c_api_A_init();


(C 的 header 原本該寫的東西)

#endif
#endif

 

 

延伸:extern 是什麼?

ref. Why use #ifndef CLASS_H and #define CLASS_H in .h file but not in .cpp?

|NEWS| What is Rich Communications Services (RCS) ?

有錢的通訊服務,提升之後更能從使用者身上刮錢提高使用手機服務的品質。

主要提升三項手機的基本服務:簡訊、電話簿、通話品質。

是說這年代誰還在用手機講電話?

RCS 簡訊,可以直接傳送圖片影音,甚至是完成購物的流程,這樣難道不夠噱錢嗎?

這行為是不是讓我們很熟悉?LINE!!! 最近還開通了轉帳服務呢!

也就是說,到時候可能這些 APP 會跟 RCS 正面衝突呢?

不過,RCS 最重要還是依賴電信商 (Mobile Network Operator,MNO) 支援與否 (因為需要 IMS core system),所以這一天還有一段時間。(軟體服務這邊,Android Framework 這邊看來是提供支援了,那對於手機設備應該難度就大幅降低了)

YouTube:6 0:54 / 1:15 Android Messages: The messaging app built for Android

也許可以整合:SMS (Short Message Service,簡訊服務) 及 MMS (Multimedia Messaging Service,多媒體簡訊)?

BTW. 也就是說,現在在台灣,如果看到手機上有 RCS 可以先關掉或停用 (反正台灣用不了),以免耗電。可以自己打 keywords 問辜狗我在說什麼 XD

 

ref.

GSMA:rcs-documentation

Google’s support for RCS

新一代RCS多媒體簡訊更普及了,Google公布43家支援業者清單,只發簡訊就內嵌購物按鈕!

Wiki – RCS

Google開始部署RCS,Android傳訊服務升級至多媒體 (2016)

|NEWS| 什麼? WiFi 跟 LTE 有可能會干擾?

呃 …… 不要緊張 沒那麼容易啦!

禮拜五有 RF 同事打電話跟我們部門說要測 WiFi(我們部門在此案子沒負責 WiFi),當然要問為什麼阿!聽說是要測看看會不會干擾??!!

 

查了一下,還真的是有可能耶!
Wlan + Bluetooth Channels:2400 – 2483.5 MHz
LTE band 7:2500 to 2570 MHz (UL), 2620 to 2690 MHz (DL)

兩個靠的還蠻近的。
(我只列 FDD 的,參考資料裡面也有列出 TDD)

BTW. LTE band 13 會干擾 GNSS (Global Navigation Satellite System)

ref.

In-Device Coexistence Interference – Rohde & Schwarz

 

延伸問題:TDD v.s. FDD?

最大差異大概就是使用國家:台灣與美國都是 FDD (學把拔,不是很正常嗎?)

ref.

LTE frequency bands

Wiki – LTE-TDD

Wiki – LTE

 

延伸問題:台灣的頻段?

電信商通常會說是多少 Mhz 來表示 LTE 所支援的頻道,

但是手機商通常用 band 來表示。所以最大效益就是:

針對你的門號,去挑選手機(反過來也可以)。

同樣 700Mhz 有 Band 12/13/14/17/28,不過台灣只有亞太有 band 28 …… 以此類推

對照表可以找 Wiki 或電信商官網或是
台灣4G LTE各業者頻寬頻段與使用技術整理比較

|Design| 非同步的施工方式:等待,Callback,Polling

剛入行時,完全不懂 Polling 是什麼意思。查字典會發現解釋為:投票之類的 XDDD
不能理解阿阿阿!!!

不過後來程式看久比較懂一點點點。(系統場優點之一:拿到晶片廠的程式碼都是高手寫的 XD)

非同步的設計,要如何問到資料呢?

 

1. 等待:

就是 …… 都不做事,等在那邊直到有結果 XD

 

2. Callback:在 C/C++ 會利用 function pointer,寫成 callback function(A),以參數的方式傳入需要用到此函式(A)的函式(X)。等到函式X 執行到需要使用 A的動作時,才會啟動 A。由於在 A需要呼叫 callback 時所需要的東西是固定的(就是在設計 A 時候寫的參數),能給的東西也是固定的!

可以參考:

CallBack Function

|Code| 使用 function pointer 建立 Handler

 

3. Polling:就是一直去問,問到得到答案為止。

缺點很明顯:浪費力氣,浪費資源。
優點 …… 很好寫(?
ref.

程式設計該同步還是非同步?

|Issue| dlopen ERROR: undefined symbol

我們可以利用 dlopen 載入動態函式庫,然後使用 dlsym 取得裡面的函式來使用。

這兩個方法使用方式可以參考:dlopen&dlsym 用法

有遇到載入失敗,出現:undefined symbol

後面接著一串很像函式名稱的東西。

那時候我猜測是有兩種可能:我函式有問題 (可是 compiler 應該不會過才對),或者,

沒有正確連結?

我使用 nm 去驗證我的想法。

nm 可以列出目標的所有 symbol,看是不是那個函式有在裏面,但有問題?還是那個函式真的沒有在裡面?

在 cmd line 執行:nm -C -D bad_lib.so

就會列出全部的 symbol。其中,-D 指的是察看的對象是動態檔唷!

 

還有一個小工具:ldd 順便介紹一下。

ldd (List Dynamic Dependencies) 可以尋找所使用的函式庫!

執行:ldd (選項) (參數)

就可以列出全部被用到的函式庫啦!

 

ref.

解決 undefined symbol / reference

 

|Issue| 將 .a 包進 .so後,無法使用 .so

Segmentation fault

–whole-archive:可以強制將每個對象包含在生成的共享函式庫裡

所以我把我要包進 .so 的 .a lib 都加上了這個參數

總算可以開啟 .so

*在 static 库中,连接器将停止在第一个符号,即使它是一个弱的,并停止寻找强大的。若要强制它查看所有符号( 就像对动态链接库所做的那样),ld 支持 --whole-archive 选项。

 

ref.

https://ask.helplib.com/others/post_12552910

|Code| Makefile 參數介紹

Makefile 裡面最複雜的就是很多符號以及參數不明白意思。

這邊稍微介紹一下。

跟編譯過程有關:

  • -c:編譯但不進行鏈結,會產生一個跟原始碼相同名字的 .o 檔
  • -O:表示最佳化的程度
  • -g:要包含偵錯資訊

跟連結有關:

  • -l :編譯過程需要一個 library。e.g. -lpthread 表示需要 libpthread.so 函式庫
  • -L:需要鏈結庫外部人家已經寫好的函式的目錄
  • -I : 優先搜尋的 include 檔案路徑

跟包成的目標函式庫有關:

  • -shared:如果目標為動態函式/共享函式庫,一定要加
  • -fPIC:包成動態函式
  • -static:包成靜態函式庫

其他字元:

%.o: %.cpp
g++ -Wall -g -c $^
  • $^:所有的必要條件(%.cpp)
  • $@:工作目標(%.o)
  • %:一個萬用字元,

e.g.:%.o: %.c 這一行,就會知道如果現在的工作目標是 demo.o 的話,就會去找對應的 demo.c

  • $<:第一個必要條件(%.cpp,本例子中只有一個必要條件)

傳遞參數:

  • -Wa : 將選項 (option) 傳給組譯器
  • -wl : 將選項 (option) 傳給連結器

備註:

*編譯不連結,表示只檢查 include 裡有沒有宣告,並不會去相關 lib 找函式真的是否存在

*動態函式跟共享函式差別在於:動態函式程式執行時期並不會去檢查該函式是否存在,而是程式執行到某功能時才進行檢查。

*編譯時,利用 -L 告訴編譯器可以該路徑下尋找 libpthread.so。

若使用了-l,則必須使用的 lib 在預設尋找的目錄中,

保險起見,可以利用 -L 指定多個路徑給編譯器。

ref.

http://maxubuntu.blogspot.com/2010/02/makefile.html

[Linux] 簡單的 Makefile 使用 (% 萬用字元、$@ 特殊符號、.PHONY 假目標)

|Jobs| NB 雙系統 : Ubuntu 回到 Windows 後,時間異常

如果你在一台筆電灌雙系統:ubuntu 及 windows,在切換時,應該會遇到一件事:

從 ubuntu  切回 windows,時間顯示異常。

這是因為 Linux base 系統時間預設是使用 UTC,然後寫進硬體時鐘。

而 windows 是使用 Local 時間存在硬體時鐘裡。

解法:

修改一個註冊檔,讓 windows 跟 ubuntu 一樣,用 UTC 當作計算時間的方法

點兩下這個註冊檔即可:WindowsTimeFixUTC.reg

 

ref. Clock shows wrong time after switching from Ubuntu to Windows 10

 

延伸:What is UTC? What is the Local time ?

WordPress.com.

Up ↑