相关疑难解决方法(0)

连接gcc libs的Sun Studio:异常不起作用

我需要使用Sun Studio构建一个应用程序.此应用程序使用只能使用Gnu C++构建的共享库.共享库有一个C接口,因此代码可由Sun编译器调用(这是为了避免名称错位问题,另请参阅此问题).

除了异常处理之外的一切都很好.当共享库中抛出异常时,程序会出现段错误.仅当使用Sun Studio编译器编译主程序时才会发生这种情况.使用Gnu C++编译器编译下面的最小示例,程序运行正常,共享库检测到异常.

计划A:动态链接以下是设置的说明:

GCC                       SOLARIS STUDIO
                shared
c_layer.so      <-----    application
(no exceptions)           (uses exceptions sol studio)
   |
   | use flag -static -static-libstdc++ -static-lib-gcc
   v
gcc_only_lib.so
libstdc++.so
(uses gcc exceptions)
Run Code Online (Sandbox Code Playgroud)

结果:抛出异常后会发生分段违规(请参阅下面的代码).

B计划:静态链接

如上所述,但建立c_layer.a

结果:


文件中未定义的第一个引用符号__cxa_allocate_exception libs/cInterface/libcInterface.a(c_layer.cpp.o)std :: string :: ~std :: basic_string()libs/cInterface/libcInterface.a(c_layer.cpp.o)__ cxa_end_catch libs /cInterface/libcInterface.a(c_layer.cpp.o)__cxa_free_exception libs/cInterface/libcInterface.a(c_layer.cpp.o)__cxa_begin_catch libs/cInterface/libcInterface.a(c_layer.cpp.o)__ cxa_throw libs/cInterface/libcInterface.一个(c_layer.cpp.o)

问题:为什么exeption处理不能与Sun Studio一起使用?


如果我像这样强制执行gcc运行时:

LD_PRELOAD=/usr/sfw/lib/amd64/libgcc_s.so ./example
Run Code Online (Sandbox Code Playgroud)

它崩溃的方式不同:

$>在抛出一个'std :: runtime_error'$>的实例后终止调用,以递归方式调用

(dbx)其中 1 __lwp_sigqueue(0x1,0x6,0xffffc1000bae5060,0xffffffff,0x0,0xffff80ffbffff810),位于0xffff80ffbf51e70a [2] thr_kill(0x0,0x0,0x0,0x0,0x0,0x0),位于0xffff80ffbf512ec8 [3]上升(0x0,0x0) ,0x0,0x0,0x0,0x0),位于0xffff80ffbf4c291d [4]中止(0x0,0x0,0x0,0x0,0x0,0x0),位于0xffff80ffbf497ff2 [5] __gnu_cxx :: __ verbose_terminate_handler(0x0,0x0,0x0,0x0,0x0, 0x0),位于0xffff80ffbd9de911 …

c++ gcc solaris sunstudio

5
推荐指数
2
解决办法
1225
查看次数

标签 统计

c++ ×1

gcc ×1

solaris ×1

sunstudio ×1