一、假設為三方提供庫原始碼和標頭檔案
1.共享庫部分
sanf.c
#include
int a;
void hello()
編譯:gcc -shared -fpic -o libsanf.so sanf.c
生成:libsanf.so
2.標頭檔案
sanf.h
extern
int a;
extern
"c"
以上sanf.h和libsanf.so即為第三方給我們提供的可用資源。
二、如何使用
1.編譯鏈結
main.cpp
#include
#include "sanf.h"
int main()
編譯:g++ -c main.cpp
g++ -o main main.o -lsanf -l.
結果:可執行檔案main
2.執行
./main
tk------->>>>a is 1
tk------_>>>>>this is hello
三、說明函式新增extern "c"原因
1.我們看c語言sanf.c編譯的庫libsanf.so中hello的符號
readelf -a libsanf.so
47: 00000000000005cc 18 func global default 11 hello
2.我們看c++語言main.cpp在不新增extern "c"時hello的符號
readelf -a main.o
13: 0000000000000000 0 notype global default und _z5hellov
在這種情況下,靜態鏈結時就會找不到符號。
3.c++語言main.cpp在新增extern "c"時hello的符號
readelf -a main.o
13: 0000000000000000 0 notype global default und hello
在這種情況下,靜態鏈結時就能找到符號。
原因:c++語言支援函式多型,導致函式在編譯後生成的符號與c不同。
《C關鍵字分析》之extern用法
一 假設為三方提供庫原始碼和標頭檔案 1.共享庫部分 sanf.c include int a void hello 編譯 gcc shared fpic o libsanf.so sanf.c 生成 libsanf.so 2.標頭檔案 sanf.h extern int a extern c 以上...
extern 關鍵字用法
overrides public virtual bool initinstance extern 摘自 extern lpdirectdraw4 lpdd 宣告lpdd,但是不分配記憶體,只說明他是你可以用的變數,在此程式之外其他的程式中已經聲名了他。其實他就是防止名字衝突 extern 申明本地...
C 之關鍵字extern
最近看了許多關於extern關鍵字的文章,有一些心得體會,本篇博文綜合了許多文章的內容,不正確的地方還希望大家能夠給予指正!其中先指明乙個誤區 許多人認為標頭檔案只能包含宣告,這其實是不對的!一 首先,讓我們來了解宣告和定義的基本概念。1.1.宣告的概念 大概來講宣告主要是為了支援模組 編譯單元 c...