c++ 代码在 FreeBSD 上没有捕获异常

标签 c++ exception try-catch freebsd

我有一个程序在许多不同的 Linux 发行版上运行。当我出于某种原因在 FreeBSD 10.1 上编译它时,catch 子句停止工作并且应该捕获的异常使我的程序崩溃。调试时,我将其中一个 catch 子句修改为“catch (...)”,但仍然没有捕获到异常。我猜这个问题与链接器有关,但我不知道如何进一步调试它。当我尝试编译一个只抛出和捕获异常的测试程序时,它起作用了——所以我猜想链接器无法正确链接不同的对象。

谁知道我该如何解决? 谢谢

编辑: 编译示例(命令中的原始路径较长,为清楚起见已将其删除):

我编译了很多这样的类:

/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)

最佳答案

您必须链接 -Wl,-rpath=/usr/local/lib/gcc<VERSION>或者你会链接到 libc++ ,这与 gcc 使用的 header 不匹配。

检查 pkg info -Dx gcc为正确的道路。

关于c++ 代码在 FreeBSD 上没有捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276748/

相关文章:

c++ - 自动参数捕获的推导规则是什么?

c++ - 尝试将存储在 char 中的时间转换为正常形式。打印一个随机值。怎么了?

c# - 尝试检索实体时,L2S 调用导致有关 int 的空分配的异常

java - 为什么字符串输入作为 double 会输出这个答案

c++ - 无法在 C++ 中从 main 实例化另一个类

java - JSF 在 h :message 中显示抛出的消息

python - 如何看到错误并仍然在 Python shell 中保持程序运行?

java - 在Catch异常之前打印出Finally

Powershell try catch invoke-sqlcmd

c++ - 使用 -g gcc 标志编译的程序是否比不使用 -g 编译的同一程序慢?