簡體   English   中英

使用extern關鍵字的鏈接未定義參考錯誤

[英]Undefined reference error at link using extern keyword

我從C源代碼創建的兩個庫libA.a(靜態)和libB.so(動態)之間存在鏈接問題。

在用於生成libB.so的源文件之一中,我具有以下功能:

static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size) { ... }
static void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { ... }

當我運行nm libB.so | grep unassigned_mem 我有nm libB.so | grep unassigned_mem

00000000004662a7 t unassigned_mem_read
0000000000466337 t unassigned_mem_write

在用於制作libA.a的源文件中,我得到了:

extern uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size);
extern void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val, unsigned size);

並進一步介紹了這些方法。

當我編譯時,一切正常。 但是然后在鏈接上,我有:

[build] qmg-mmio.c:47: undefined reference to 'unassigned_mem_read'
[build] qmg-mmio.c:84: undefined reference to 'unassigned_mem_write'

當我做nm libA.a | grep unassigned_mem 我有nm libA.a | grep unassigned_mem

U unassigned_mem_read
U unassigned_mem_write

我按以下順序鏈接:libB.so,libA.a。

由於符號相同,是什么使它們不被解析?

而且,當我將所有源代碼一起編譯時,鏈接也沒有問題。 完全鏈接我錯過的靜態庫和動態庫時,是否存在子技巧?

對於文件作用域標識符, static關鍵字指定內部鏈接 這意味着標識符和任何關聯的定義對於出現它們的翻譯單元基本上是私有的。 為避免混淆,請注意,這僅與“靜態庫”相關,尤其是靜態庫中打算由庫用戶直接調用的函數一定不能聲明為static ,因為直接並專門防止這種情況的發生。調用。

鏈接是標識符的屬性,在它們的范圍內,而不是它們標識的對象或功能,在其他范圍內不一定是同一標識符。 此外,同一標識符可以與不同范圍內的不同對象和/或功能相關聯。 特別是,給定標識符的extern聲明與與同一個標識符的任何內部聲明相關聯的函數或對象關聯的函數或對象不同,因此您無法通過添加聲明來將出現在一個作用域中的內部聲明重新定義為外部聲明在其他范圍內。

由於您似乎不願意修改包含要調用的函數的庫,因此我假設它是由第三方提供的。 在這種情況下,您應該理解聲明這些函數為static是,庫用戶 不要直接調用它們。 它們不是庫的外部接口的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM