C C 鏈結有關的問題

2021-06-12 10:23:09 字數 1313 閱讀 4996

如果我們需要引用乙個外部庫裡面的變數或函式,要涉及到extern,具體該怎麼寫呢?

下面是一小段例子函式:假設我們有2個原始檔hello.h和hello.cpp

hello.h的**如下

#ifdef __cplusplus

extern "c"

#endif

hello.cpp的**如下

extern const char g_test = ;
第三方有個main.cpp,原始碼如下

#include #include "hello.h"

int main()

編譯

g++ -o hello.cpp.o -c hello.cpp

g++ -o main.cpp.o -c main.cpp

g++ hello.cpp.o main.cpp.o -o hello

執行輸出:

first char is:a

這樣是正確的,可以執行。

有幾個問題:1.extern在語法書上都是表示:宣告乙個變數,不分配記憶體空間,那麼hello.h和hello.cpp中用的都是extern,mian.cpp中也沒有定義,是在**分配的記憶體呢?

原因:大部分書上在講extern的時候都是這麼講的,實際上加上extern確實是宣告,但是如果變數後面還有賦值操作,例如:extern int i = 0; 

那麼這個就是宣告 +  定義了,注意:為什麼不是簡單的定義呢?即 extern int i = 0; 不等價於 int i = 0;

這是因為c/c++有三種linkage方式:1.extern linkage 2.internal linkage 3.none linkage, 對於全域性變數,不加extern,預設則是internal,所以上面二者是不等價的,如果需要外部鏈結,必須加extern。

c/c++有兩種link object,extern object(函式外的宣告)和internal object(函式內的宣告)

下面是這三種方式的可見範圍

type of linkagetype of objectaccessibility

external

external

throughout the program

internal

external

a single file

none

internal

local to a single function

gcc,g 編譯鏈結有關的路徑

在linux下編譯鏈結或執行c c 程式時可能會遇到找不到標頭檔案,找不到庫檔案的錯誤,簡單總結一下這些錯誤的解決方法 1,找不到標頭檔案 解決方法一 在編譯時使用 i 來指定標頭檔案的路徑,例如把頭檔案放在 home user include 目錄下,則在編譯時加上 i home user inc...

可執行檔案中和動態鏈結有關的段section

內容是乙個字串,儲存了動態鏈結器的路徑,如 lib ld linux.so.2 有幾種檢視方式 objdump s a.out readelf l a.out grep interpreter 儲存了動態鏈結器所需的基本資訊,具體可以看elf.h檔案或lsb手冊 依賴於哪些共享物件 動態鏈結符號表....

手機端點解鏈結有外框的問題

有的時候,用a作為鏈結的標籤,但是有時在手機出現藍色外框,很醜,考慮用別的標籤代替a 處理此問題。注意,所謂的outline none是沒用的 方案 1 在a標籤裡加入js控制,當a標籤被聚焦時,強制取消焦點,這時候a標籤自然不會有虛線框。測試 這裡設定聚焦時觸發blur 強制取消焦點。3 不適用a...