我从这里安装了Solaris 11 x86(在qemu环境中):http://www.oracle.com/technetwork/server-storage/solaris11/downloads/index.html
我已经从这里解压缩/选择Sun Studio 12.3 x86 for Solaris 11:http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/index.html
但是编译器找不到像sys/types.h或inttypes.h这样的系统头文件或任何可能定义int32_t的系统头文件.例如,dtrace.h头文件依赖于sys/types.h,我找不到它.好像我错过了一个包裹或什么的.我从来没有使用过Linux以外的任何东西(许多发行版,包括来自源代码),我迷失了.我错过了什么?
这个问题关系到这一个,以及它的答案.
我刚刚发现了一些正在构建的构建中的丑陋.情况看起来有点像以下(用gmake格式编写); 请注意,这特别适用于sparc和x86硬件上的32位内存模型:
OBJ_SET1 := some objects
OBJ_SET2 := some objects
# note: OBJ_SET2 doesn't get this flag
${OBJ_SET1} : CCFLAGS += -PIC
${OBJ_SET1} ${OBJ_SET2} : %.o : %.cc
${CCC} ${CCFLAGS} -m32 -o ${@} -c ${<}
obj1.o : ${OBJ_SET1}
obj2.o : ${OBJ_SET2}
sharedlib.so : obj1.o obj2.o
obj1.o obj2.o sharedlib.so :
${LINK} ${LDFLAGS} -m32 -PIC -o ${@} ${^}
Run Code Online (Sandbox Code Playgroud)
显然,它可以在共享对象中混合使用和不使用PIC编译的对象(这已经使用了多年).我不太了解PIC是否知道这是一个好主意/聪明,而我的猜测是在这种情况下它不是必需的,而是它正在发生,因为有人不在乎找到正确的方法来做到这一点关于构建的新东西.
我的问题是:
我们正在迁移到Sun Studio 12.1并使用新的编译器[CC:Sun C++ 5.10 SunOS_sparc 2009/06/03].编译使用早期版本的Sun编译器[CC:Sun WorkShop 6 update 2 C++ 5.3 2001/05/15]编译好的代码时,我遇到了编译错误.
这是我得到的编译错误.
"Sample.cc":错误:无法找到main()中所需的LoopThrough(int [2])匹配项.1检测到错误.***错误代码1.
码:
#include <iostream>
#define PRINT_TRACE(STR) \
std::cout << __FILE__ << ":" << __LINE__ << ":" << STR << "\n";
template<size_t SZ>
void LoopThrough(const int(&Item)[SZ])
{
PRINT_TRACE("Specialized version");
for (size_t index = 0; index < SZ; ++index)
{
std::cout << Item[index] << "\n";
}
}
/*
template<typename Type, size_t SZ>
void LoopThrough(const Type(&Item)[SZ])
{
PRINT_TRACE("Generic version");
}
*/
int main()
{
{
int arr[] …
Run Code Online (Sandbox Code Playgroud) c++ templates partial-specialization sunstudio overload-resolution
当使用GNU Fortran(v4.4.3)或Sun Studio F95(v8.3)进行编译且没有数组界限时,检查以下程序是否正确运行。但是,当分别打开数组边界检查(gfortran -fbounds-check
和f95 -C
)时,GNU编译的可执行文件将再次运行而不会出现错误,而Sun Studio编译的可执行文件会给出运行时错误,
****** FORTRAN RUN-TIME SYSTEM ******
Subscript out of range. Location: line 44 column 20 of 'nosize.f90'
Subscript number 2 has value 1 in array 't$27'
Run Code Online (Sandbox Code Playgroud)
这是对的错误,该调用sub2()
使用的自动数组虚拟参数x
。该sub1()
呼叫运行罚款或者编译器和任何标志。
据我所知,该程序是“合法的”,因为零大小的数组可以像非零大小的数组一样被引用,并且没有零长度维的显式索引x
。但是,我在这里缺少一些零尺寸的数组切片或自动数组的微妙之处吗?我是否应该期望数组边界检查在不同的编译器中表现相同,还是应该将其视为特定于供应商的扩展?
MODULE subs
IMPLICIT NONE
CONTAINS
SUBROUTINE sub1(x)
IMPLICIT NONE
REAL :: x(:,:)
PRINT*,'------------------------------------'
PRINT*,SHAPE(x)
PRINT*,SIZE(x)
END SUBROUTINE sub1
SUBROUTINE sub2(n1,n3,x)
IMPLICIT NONE
INTEGER,INTENT(in) :: n1, n3
REAL :: x(n1,n3)
PRINT*,'------------------------------------'
PRINT*,SHAPE(x)
PRINT*,SIZE(x)
END SUBROUTINE …
Run Code Online (Sandbox Code Playgroud) 我希望为以下C++编译问题和相应的编译器启用警告:
未使用的变量 - Sun Studio CC
例: void m() { int i = 10; }
签署无符号比较 - VC++和Sun Studio CC
例: if ((unsigned) 10 < -1);
错误的字段初始化顺序 - VC++和Sun Studio CC
例: class A { int i, j; A() : j(0), i(0) {} };
所有这些都被GCC捕获,我想在VC++和Sun Studio中启用它们.
bash-4.1$ g++ -Wall main.cpp
main.cpp: In function ‘void m()’:
main.cpp:1: warning: comparison between signed and unsigned integer expressions
main.cpp:1: warning: unused variable ‘i’
main.cpp: In constructor ‘A::A()’:
main.cpp:1: warning: ‘A::j’ …
Run Code Online (Sandbox Code Playgroud) 是否会在Solaris上构建完整的Boost?
我想知道是否有人在此之前取得了成功(特别是原型/精神版),然后再支付修补Sun Studio 12.2到最新版本的支持合同.我得到了一些错误,有些看起来已经在修补程序中得到了解决,但是向Oracle支付费用并不便宜,所以我宁愿希望它能在我做之前完成.
现在,我只是尝试在Solaris上使用cpp-netlib并使用Boost属性树解码一些通过HTTP获取的JSON.它在Mac OS X上运行良好 - 所以我希望我可以在Solaris上使用相同的代码.
我需要使用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 …
与SunStudio11捆绑在一起的STLport会产生很多警告.我相信大多数编译器都有办法禁用某些源文件的警告,如下所示:
太阳C.
#pragma error_messages off
#include <header.h>
// ...
#pragma error_messages on
Run Code Online (Sandbox Code Playgroud)
GCC
#pragma warning(push, 0)
#include <header.h>
// ...
#pragma warning(pop)
Run Code Online (Sandbox Code Playgroud)
你如何在SunStudio C++编译器中做到这一点?(顺便说一句,sunstudio C pragma在sunstudio C++中不起作用)
我正在构建.so库并且想知道 - b/w -h和-o cc complier选项(使用Sun Studio C++)有什么区别?
他们不是指同一件事 - 输出文件的名称?
是不可能在main()中定义结构.我尝试以下只是为了获得分段错误:
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#define TRUE 1
void main(int argc,char **argv)
{
struct test_struct
{
char test_name[50];
char summary_desc[200];
char result[50];
};
struct suite_struct
{
char suite_name[50];
struct test_struct test[500];
int test_count;
int passed;
int failed;
int unresolved;
int notrun;
}suite[500];
int a,b;
for (a=0;a<500;a++)
{
strcpy(suite[a].suite_name,"");
for (b=0;b<500;b++)
{
strcpy(suite[a].test[b].test_name,"");
strcpy(suite[a].test[b].summary_desc,"");
strcpy(suite[a].test[b].result,"");
}
suite[a].test_count=0;
suite[a].passed=0;
suite[a].failed=0;
suite[a].unresolved=0;
suite[a].notrun=0;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我在其外部采用结构定义时,它的工作原理是:
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#define TRUE 1
struct test_struct
{
char test_name[50];
char …
Run Code Online (Sandbox Code Playgroud)