2015-10-22 24 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