2013-04-22 84 views
3

使用edk2(UEFI)時,memcpy和memset等函數不可用,但它們具有函數CopyMem和SetMem。通常情況下,這並不是太多問題,但有時編譯器會執行優化,用memcpy/memset替換我的代碼,並且我得到鏈接器錯誤,說我有一個未解決的對它們的引用。據我所知,他們基本上使用相同的(相同的參數和whatnot)。編譯器定義,將函數重定向到不同的名稱

我在想什麼可以解決這個問題,而不是單獨處理實例。我試着用谷歌搜索編譯宏,但我找不到一個很好的例子,看看它是否是一個很好的方法。

+0

請諮詢您的編譯器(和鏈接)的文檔。可以告訴許多連接器爲你做這件事。 – mah 2013-04-22 18:05:16

回答

1

如果編譯器插入memcpy()memset()作爲優化過程的一部分,那麼就有使用宏無法實現。您的機會是:

I.在每種情況下逐漸降低優化級別,直到鏈接器錯誤消失。

二,切換到符合標準的庫

三。手動執行memcpy()memset()

+0

我的特殊問題是通過添加/ Od標誌來「解決」,而不是那真的是一個很好的解決方案。我試過/ Oi-,但那給了我錯誤。 – DanielCardin 2013-04-23 14:53:50

1

如果你使用的GCC,

您可以通過使用該標誌​​禁止引進memcpy()

使用__REDIRECT宏(在sys/cdefs.h)也可能工作:

__REDIRECT (memcpy, (void *dest, const void *src, size_t n), CopyMem); 
+0

必需,即時通訊使用vs2008 – DanielCardin 2013-04-22 19:25:41

1

作爲一種變通方法創建轉發包裝:

void* memcpy(void *dest, const void *src, size_t n) { 
    return CopyMem(dest, src, n); 
} 
+0

「內在函數,不能定義」:( – DanielCardin 2013-04-23 14:34:37

+0

然後你唯一的選擇是項目屬性> C++>優化>啓用內函數>否 – 2013-04-23 14:37:48

相關問題