簡體   English   中英

由 C++ 庫實現的 Solaris 的 stdlib.h 函數?

[英]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; 以及許多其他標准函數,如freemallocatoi等,在 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.

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