【问题标题】:c++ code doesn't catch exception on FreeBSDc++ 代码不会在 FreeBSD 上捕获异常
【发布时间】:2015-10-22 08:40:36
【问题描述】:

我有一个程序在许多不同的 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)

【问题讨论】:

  • 我们很难说出你的代码做了什么,什么时候我们没有看到它,或者你用于编译和链接的选项。 “禁用异常”是一种可能的编译器选项...
  • 你在 FreeBSD 上的编译器必须有不同的默认设置。
  • 感谢您的回复,我编辑了问题并添加了更多信息。
  • @Surt 我不认为这是默认的编译器设置,因为我的测试程序使用相同的编译器编译并设法捕获异常
  • @ItamarBe,那么我们需要最少的代码来显示问题。就像是。 int main() { try { thorw "it"; } catch(...) { printf("caught\n"); } return 0 }

标签: c++ exception try-catch freebsd


【解决方案1】:

你必须链接到-Wl,-rpath=/usr/local/lib/gcc&lt;VERSION&gt;,否则你会链接到libc++,这与gcc使用的头文件不匹配。

检查pkg info -Dx gcc 以获取正确的路径。

【讨论】:

  • 感谢@kamikaze!就像我在我的 Makefile 中硬编码的 /usr/loca/lib 的魅力一样,将更改它以自动发现位置。
  • 只是出于好奇,你为什么首先强制 gcc 作为编译器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多