2015-05-13 31 views
3

我正嘗試在LPCXpresso上爲LPC1769創建一個項目。我有一個C文件調用儘管「string.h」未定義對'strnlen'的引用包括

#include <string.h> 
int main() 
{ 
    //some stuff 
    strnlen(SomeString, someInt); 
} 

,而我得到一個錯誤:

Undefined reference to 'strnlen' 

怪異的一部分是有是的strcpy,strncpy()函數或其他常見的字符串函數沒有問題。

我建立了Cortex-M3處理器 編譯器使用的是:臂無 - EABI - 海合會 在Eclipse中,我已經選中了MCU連接選項:沒有啓動或默認的庫 我在Ubuntu

運行Eclipse

雖然它可能是很容易通過只使用strlen的,我使用它採用strnlen庫實際上面臨着一個問題,我不想與庫源混亂繞過這一點。

+0

我改變編譯器的頭庫從Redlib到Newlib在項目C/C++建立在Eclipse設置。這需要處理問題 – TSG

回答

3

strnlen功能是指定(直到最近)一個Linux特有的功能(一些文件,如GNU libc manual文件夾仍然說,這是一個「GNU擴展」)。目前的manual page表示它是POSIX.1-2008的一部分。由於您正在進行交叉編譯,因此目標機器的運行時庫可能沒有此功能。 2011年的forum posting就是這麼說的。

0

你要這個包括代替:

#include <string.h> 

<>""之間的區別是,<>頭文件搜索您的系統包括文件夾。該""頭文件搜索在當前目錄和任何其他包括由-I directory

+0

我認爲#include「」和<>都搜索到處,並且「」首先搜索當前目錄,然後搜索系統頭文件,而<>遵循其他順序。 (編輯 - 這是不正確的) 見(http://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename)爲差異的更好explainantion。 此外,做出這樣的轉變並沒有解決爲什麼在用「strnlen」包裝/用戶自定義時......尤其是當他被套牢庫,其源,他不希望修改皺起了眉頭功能問題 – TSG

0

下可以爲你工作(因爲strnlen()不運行時11b的一部分)。

定義你自己的/本地的strnlen()的版本。

int strnlen(char *param, int maxlen) 
{ 
    // Perform appropriate string manipulation ... as needed. 
    // Return what you need. 
}; 
+0

,並與一個平臺,運行時庫沒有定義的strnlen ...? – iammowgli

+0

謝謝。在這種情況下,他可以在strnlen()的定義中簡單地使用第二個參數「maxlength」,並在該函數內執行適當的字符串操作並返回他所需的內容。我的觀點是...用戶定義的包裝可能可以解決他的問題。 – iammowgli

+0

在我之前的評論中,'執行適當的字符串操作'並不意味着在包裝器中使用strlen()。我的意思是:'在這個用戶定義的包裝器中寫'你自己的版本的strnlen()'... – iammowgli

1

我添加了同樣的問題,我發現使用-std=gnu++11編譯器標誌解決它。

相關問題