簡體   English   中英

在 Windows 上使用 Glib 庫成功構建的 C 代碼在 linux 上出現編譯器/鏈接器錯誤

[英]C Code using Glib library building succesfully on windows gives compiler/linker error on linux

我有一個使用 Glib 庫創建新類型的代碼。 現在代碼如下:

.h文件:

G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_state, NEW, TYPE_STATE, ParentType)

.c文件:

G_DEFINE_TYPE_WITH_PRIVATE(NewTypeState, new_type_state, NEW_TYPE_STATE)

現在根據用於創建對象的glib 文檔,我們必須將兩個靜態函數定義為:

static new_type_init()

static new_type_class_init()

但是在代碼中而不是定義靜態 new_type_init() func。 聲明為:

__declspec(dllexport) extern void new_type_init()

並定義為:

void new_type_init()
{}

並且代碼在 Windows 上成功編譯和鏈接,但是在嘗試在 linux 上構建時,我刪除了__declspec(dllexport)但我開始收到錯誤:

靜態聲明遵循非靜態聲明

現在我注釋掉了 .h 文件中的聲明,並且在 .c 文件中只有非靜態定義,但是在嘗試構建它時,我得到了鏈接器錯誤:

未定義的引用new_type_init

我什至將extern添加到定義中,但錯誤仍然存​​在。

有人可以解釋上述行為嗎?

編輯:

o/p for objdump -t <file-name> | grep -i <symbol-name> objdump -t <file-name> | grep -i <symbol-name>是:

000000000000b440 l     F .text  0000000000000023              symbol-name
0000000000000000         *UND*  0000000000000000              symbol-name

Extern 表示該函數稍后可用(即在此翻譯單元中未在此處定義)。 靜態強制函數在外部不可用。 將 extern 添加到標頭中的聲明並從定義中刪除靜態,您可能會取得一些成功。 話雖如此,我不知道 Glib,所以不能肯定地說。

暫無
暫無

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

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