2013-07-15 57 views
1

我有這樣的代碼,其我試圖使用-msse4.2 GCC-TDM 1.7.4-2運行(我試圖msse4)配有一個錯誤:對__lzcnt16的未定義引用?

sse_lzcnt.c|7|warning: implicit declaration of function '__lzcnt16'| 
sse_lzcnt.c|9|warning: too many arguments for format| 
obj\Debug\sse_lzcnt.o||In function `main':| 
sse_lzcnt.c|7|undefined reference to `__lzcnt16'| 

一個未定義的參考通常是一個連接錯誤,由於一個缺少的lib文件(.a結尾),但內部頭文件不需要一個?

我確保內部頭文件在正確的包含目錄中。繼承人的代碼,

#include <x86intrin.h> 
#include <stdio.h> 

int main() 
{ 
     unsigned short __X = 256; 
     unsigned short RESULT = __lzcnt16(__X); 

     printf("result: ", RESULT); 

     return 0; 
} 
+0

你知道,這個指令是AMD-而已,對不對? –

+0

@Paul R我正在使用AMD-8150 FX處理器,因此它應該可以工作。爲什麼英特爾沒有它? – pandoragami

+0

英特爾終於增加了添加lzcnt(以Haswell開頭)。但是對於英特爾和AMD來說,使用專用cpuid位來檢測lzcnt。多麼痛苦。對於許多應用程序,bsr指令是lzcnt的合適替代品。英特爾和AMD都將bsr指令納入了年齡。所以在很多情況下,使用它沒有任何cpuid檢查是安全的。有關使用bsr代替lzcnt的示例,請參閱此應用程序:http://notabs.org/primitivepolynomials/version2/2.5/primitivepolynomials.htm。 – ScottD

回答

2

您需要使用gcc的命令行選項:-mlzcnt

+0

並且'-mlzcnt'應該是爲編譯權限添加'-msse'的地方。現在編譯:sse_lzcnt.c cc1.exe:錯誤:無法識別的命令行選項「-mlzcnt」' – pandoragami

+0

好的,對不起。對於該版本的gcc,請使用-mbmi。顯然gcc最近改變了啓用這條指令的選項。 – ScottD

+0

現在它甚至不認識它? '編譯:sse_lzcnt.c cc1.exe:錯誤:無法識別的命令行選項「-mbmi」' – pandoragami