![](/img/trans.png)
[英]mingw/include/c++/cstdlib: stdlib.h: No such file or directory
[英]Solaris' stdlib.h functions implemented by C++ libs?
我正在努力將開源工具移植到 Solaris。 大多數事情都有效,cmake/pkg-config/etc。 在那里,找到依賴項,gmake 工作,編譯器和鏈接器調用看起來都很好,tren,boom:
Undefined first referenced
symbol in file
std::qsort(void*, unsigned int, unsigned int, int (*)(const void*, const void*)) ...
這部分我不明白。 乍一看, std::qsort 沒有意義,它應該是 C 庫的一部分,而不是 STL。 所以我查看了 stdlib.h 並找到了一個列表,比如using std::sort;
以及許多其他標准函數,如free
、 malloc
、 atoi
等,在 C++ 上下文中重定向。
Oracle 在那里做什么?為什么? 如果他們像這樣重定向它,我應該鏈接哪個庫? 或者為什么 CC 命令不像 GCC 那樣自動拉入它? 我嘗試添加 -lstdc++ 但沒有運氣。
或者,普通的 libc 版本似乎在 <iso/stdlib_c99.h>(或 <iso/stdlib_iso.h>)中定義。 直接包含其中一個標題是否合法,還是會在鏈接時造成其他隨機破壞?
編輯:
由於對構建系統的怪異存在多種懷疑,這里基本上是來自 gmake 執行的鏈接調用:
/opt/developerstudio12.6/bin/CC -std=c++11 -xO3 -DNDEBUG <i.e. bunch of object files> -o ../systest -L/opt/csw/lib/64 -lintl
我在那里看不到任何特別的東西,我希望 CC 弄清楚要鏈接什么才能獲得強制性功能。
規則是#include <xxx.h>
將名稱放入全局命名空間,並且也允許將它們放入std
。 相反, #include <cxxx>
將名稱放入std
,也允許將它們放入全局命名空間。 實際上,這意味着有兩種方法可以在 C++ 中實現標准 C 庫中的函數:在<xxx.h>
頭文件中聲明標准 C 庫名稱並將這些聲明提升到cxxx
頭文件中的std
中,或者聲明標頭中std
中的名稱,並將這些聲明提升到<xxx.h>
標頭中的全局命名空間中。 使用前一種方法,函數的名稱將是qsort
; 對於后者,它將是std::qsort
。 無論哪種方式,該錯誤消息通常都表明編譯器存在設置問題。 鏈接器沒有找到標准庫。
這個編譯命令
/opt/developerstudio12.6/bin/CC -std=c++11 -xO3 -DNDEBUG ...
將產生一個 32 位的可執行文件。 根據Oracle CC
手冊頁:
在 Oracle Solaris 上,
-m32
是默認值。 在支持 64 位程序的 Linux 系統上,-m64 -xarch=sse2
是默認值。
但是這個庫選項
-L/opt/csw/lib/64
正在搜索一個充滿64 位庫的目錄。
將-m64
添加到編譯命令或使用 32 位庫路徑。
更新
如果該問題包含完整的錯誤消息,幾乎可以肯定是可以回答的,這幾乎可以肯定是這樣的:
CC -g qsort.cc -o qsort
"qsort.cc", line 15: Error: Could not find a match for std::qsort(int[4], unsigned, unsigned, int(void*,void*)) needed in main(int, char**).
"/usr/include/iso/stdlib_iso.h", line 184: Note: Candidate 'std::qsort(void*, unsigned, unsigned, extern "C" int(*)(const void*,const void*))' is not viable: argument '4' can't be converted from 'int(void*,void*)' to 'extern "C" int(*)(const void*,const void*)'.
"/usr/include/iso/stdlib_iso.h", line 187: Note: Candidate 'std::qsort(void*, unsigned, unsigned, int(*)(const void*,const void*))' is not viable: argument '4' can't be converted from 'int(void*,void*)' to 'int(*)(const void*,const void*)'.
在 Solaris 11.4 上使用 Oracle Developer Studio 12.6 編譯時,此代碼運行良好:
#include <stdlib.h>
int compare( const void *p1, const void *p2 )
{
int i1 = *( ( int * ) p1 );
int i2 = *( ( int * ) p2 );
return( i1 - i2 );
}
int main( int argc, char **argv )
{
int array[ 4 ] = { 5, 8, 12, 4 };
qsort( array, sizeof( array ) / sizeof( array[ 0 ] ),
sizeof( array[ 0 ] ), &compare );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.