2013-07-27 41 views
1

意外地,我用-shared標誌與hello world C++程序鏈接並獲得了exe文件。但運行時輸出是段錯誤。有人能告訴我背後的原因嗎?C++共享標誌段錯誤

的方式重現:在日食ç

標準C++的hello world問題++。 在設置 - >共享庫設置中檢查共享標誌框。

構建輸出:

使所有 建築文件:../app.cpp 調用:GCC C++編譯器 克++ -O0 -g3 -Wall -c -fmessage長度= 0 -fPIC -MMD - MP -MF 「app.d」 -MT 「app.d」 -o 「app.o」 「../app.cpp」 建好:../app.cpp

建設目標:應用程序調用 :GCC C++ Linker g ++ -shared -o「app」./app.o
完成建築物目標:應用程序

執行輸出: 分段故障

由於

+0

您已構建共享庫,而不是可執行文件。嘗試執行共享庫通常會導致分段錯誤。除非你想建立一個共享庫,否則不要使用'-shared'。 –

+0

你能告訴我爲什麼執行共享庫會導致segFault?謝謝 – cppython

+0

@cppython共享庫不需要入口點(函數main),因此係統無法知道從代碼開始執行的位置。此外,C運行時代碼中的可執行鏈接調用main(),如果main()返回,則調用exit()。 –

回答

5

選自G ++手冊: --shared 生產,然後可以與其它對象連接以形成可執行的共享對象。並非所有系統都支持此選項。對於可預測的結果,您還必須指定用於在指定此選項時用於生成代碼的相同選項集(-fpic,-fPIC或模型子選項)。

當你放上--shared選項時,這意味着你不想要一個可執行文件,而是一個共享對象。

你的情況,你創建一個共享庫,而不是一個可執行文件。這就是爲什麼你在啓動時發生段錯誤。

+0

因此,我必須添加-shared標誌來構建(.so或.dll)文件。對? – cppython

+0

.so和.dll文件都是共享庫。 .so在unix下使用,而.dll在Windows上使用。 – Joyas