2015-10-22 54 views
1

我有一個運行在許多不同Linux發行版上的程序。當我在FreeBSD 10.1上編譯它時出於某種原因,catch子句停止工作,應該被捕獲的異常使我的程序崩潰。在調試時,我修改了其中一個catch子句以「catch(...)」,但仍然沒有發現異常。我猜這個問題與鏈接器有關,但我不知道如何進一步調試。當我嘗試編譯一個簡單的拋出和捕獲異常的測試程序時 - 所以我猜測鏈接器無法正確鏈接不同的對象。C++代碼在FreeBSD上沒有發現異常

任何人都知道我該如何解決它? 感謝

編輯: 編譯實例(在命令原始路徑較長,刪除了他們爲清楚起見):

我整理了很多這樣的類:

/usr/local/bin/g++ -O3 -c -DFreeBSD -D_FreeBSD -I. -I/usr/local/openjdk8/include -I/usr/local/openjdk8/include/freebsd -DBOOL_DEFINED -D_BOOL -DFreeBSD -fPIC -I../../../../common/cpp -DVERSION_MAJOR=8 -DVERSION_MIDDLE=2 -DVERSION_MINOR=8 -DNSC_DEBUG -DUSE_HINT_FILES -o CNBCommand.o CNBCommand.cpp 

然後創建

歸檔
ar srv "bin/FreeBSD_10.1-RELEASE/mechanism.a" <many .o files compiled like above> 

和最終可執行文件與鏈接:

/usr/local/bin/g++ -O3 -B/usr/local/bin -rpath=/usr/local/lib -lstdc++ -lpthread -o "../bin/FreeBSD_10.1-RELEASE/nbstatus" <many *.o files compiled like above> bin/FreeBSD_10.1-RELEASE/mechanism.a 

這是G ++我用:

/usr/local/bin/g++ -v 
Using built-in specs. 
COLLECT_GCC=/usr/local/bin/g++ 
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc49/gcc/x86_64-portbld-freebsd10.1/4.9.3/lto-wrapper 
Target: x86_64-portbld-freebsd10.1 
Configured with: ./../gcc-4.9-20141126/configure --disable-nls --enable-gnu-indirect-function --libdir=/usr/local/lib/gcc49 --libexecdir=/usr/local/libexec/gcc49 --program-suffix=49 --with-as=/usr/local/bin/as --with-gmp=/usr/local --with-gxx-include-dir=/usr/local/lib/gcc49/include/c++/ --with-ld=/usr/local/bin/ld --with-pkgversion='FreeBSD Ports Collection' --with-system-zlib --with-ecj-jar=/usr/local/share/java/ecj-4.5.jar --enable-languages=c,c++,objc,fortran,java --prefix=/usr/local --mandir=/usr/local/man --infodir=/usr/local/info/gcc49 --build=x86_64-portbld-freebsd10.1 
Thread model: posix 
gcc version 4.9.3 20141126 (prerelease) (FreeBSD Ports Collection) 
+0

我們很難說出你的代碼做什麼,什麼時候我們沒有看到它,或者你用於編譯和鏈接的選項。 「禁用異常」是一種可能的編譯器選項... –

+0

FreeBSD上的編譯器必須具有不同的默認設置。 – Surt

+0

感謝您的回覆,我編輯了問題並添加了更多信息。 – ItamarBe

回答

3

您有-Wl,-rpath=/usr/local/lib/gcc<VERSION>鏈接,否則你會反對libc++,這不符合頭GCC使用鏈接。

檢查pkg info -Dx gcc爲正確的路徑。

+0

謝謝@kamikaze!像魅力一樣工作 我在我的Makefile中對/ usr/loca/lib進行了硬編碼,會將其更改爲自動發現位置。 – ItamarBe

+0

出於好奇,爲什麼你首先強制執行gcc作爲編譯器? – arrowd