我正在尝试在Solaris上构建AWS C ++ SDK,但无法成功完成。
我在AWS C ++ SDK页面上发现this个未解决的问题,它说有可能,但是没有任何指导,希望这里的人能为您提供帮助。
这是我用来构建它的命令:
$ cmake ../aws-sdk-cpp/ -DCMAKE_BUILD_TYPE=Debug -DBUILD_ONLY="s3"
以下是输出:
-- TARGET_ARCH not specified; inferring host OS to be platform compilation target
-- Building AWS libraries as shared objects
-- Generating linux build config
-- Building project version: 1.7.134
-- Configuring done
-- Generating done
-- Build files have been written to: /workspace/dmoini/sdk_build/.deps
gmake: Warning: File 'Makefile' has modification time 267 s in the future
gmake[1]: Warning: File 'CMakeFiles/Makefile2' has modification time 267 s in the future
gmake[2]: Warning: File 'CMakeFiles/AwsCCommon.dir/progress.make' has modification time 267 s in the future
gmake[2]: warning: Clock skew detected. Your build may be incomplete.
gmake[2]: Warning: File 'CMakeFiles/AwsCCommon.dir/progress.make' has modification time 267 s in the future
[ 4%] Performing build step for 'AwsCCommon'
[ 1%] Building C object CMakeFiles/aws-c-common.dir/source/array_list.c.o
In file included from /usr/include/stdio.h:37:0,
from /workspace/dmoini/sdk_build/.deps/build/src/AwsCCommon/include/aws/common/common.h:22,
from /workspace/dmoini/sdk_build/.deps/build/src/AwsCCommon/include/aws/common/array_list.h:18,
from /workspace/dmoini/sdk_build/.deps/build/src/AwsCCommon/source/array_list.c:16:
/opt/gcc-5.1.0/lib/gcc/i386-pc-solaris2.11/5.1.0/include-fixed/sys/feature_tests.h:405:2: error: #error "Compiler or options invalid for pre-UNIX 03 X/Open applications and pre-2001 POSIX applications"
#error "Compiler or options invalid for pre-UNIX 03 X/Open applications \
^
gmake[5]: *** [CMakeFiles/aws-c-common.dir/build.make:63: CMakeFiles/aws-c-common.dir/source/array_list.c.o] Error 1
gmake[4]: *** [CMakeFiles/Makefile2:484: CMakeFiles/aws-c-common.dir/all] Error 2
gmake[3]: *** [Makefile:139: all] Error 2
gmake[2]: *** [CMakeFiles/AwsCCommon.dir/build.make:112: build/src/AwsCCommon-stamp/AwsCCommon-build] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/AwsCCommon.dir/all] Error 2
gmake: *** [Makefile:84: all] Error 2
CMake Error at CMakeLists.txt:193 (message):
Failed to build third-party libraries.
另外,这是我的系统信息:
$ uname -a
SunOS bld-dmoini-01-sv4b 5.11 omnios-r151020-4151d05 i86pc i386 i86pc
任何人和所有帮助/指导都将不胜感激。
答案 0 :(得分:2)
我已经在Solaris 11.4的库存安装上成功完成了AWS C ++ SDK的编译,并发现了可能导致上述问题的几个问题。
从干净的源代码树开始。
删除-Werror
要做的第一件事是删除-Werror
编译器选项。默认情况下,Solaris 11.4上安装的OpenSSL版本具有许多不赞成使用的功能,并且-Werror
选项会导致在遇到不赞成使用的版本时使构建失败。我使用了从AWS开发工具包源树的最顶层目录运行的find
命令来删除所有-Werror
选项:
vi `find . | xargs grep -l Werror`
您将获得大约三个或四个文件,其中只有两个实际上将-Werror
设置为编译器选项。只需从这些文件中删除"-Werror"
字符串即可。
修复POSIX定义
然后在最顶层的目录中运行cmake .
。它将失败,因为它下载的cmake文件将具有不正确的POSIX命令行选项--D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=500
。 500
是错误的。 _POSIX_C_SOURCE=200809L
对应于_XOPEN_SOURCE=700
。 _XOPEN_SOURCE=500
是SUSv2, circa 1997。用C99编译SUSv2应用程序是不合适的。
每2.2.1 Strictly Conforming POSIX Application, paragraph 8:
- 对于C编程语言,应在包含任何标头之前将
_POSIX_C_SOURCE
定义为200809L
和2.2.4 Strictly Conforming XSI Application, paragraph 8:
- 对于C编程语言,应在包含任何标头之前将
_XOPEN_SOURCE
定义为700
每the Illumos sys/feature_tests.h
file(基于OpenSolaris,它也是Solaris 11的基础):
* Feature Test Macro Specification
* ------------------------------------------------ -------------
* _XOPEN_SOURCE XPG3
* _XOPEN_SOURCE && _XOPEN_VERSION = 4 XPG4
* _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED = 1 XPG4v2
* _XOPEN_SOURCE = 500 XPG5
* _XOPEN_SOURCE = 600 (or POSIX_C_SOURCE=200112L) XPG6
* _XOPEN_SOURCE = 700 (or POSIX_C_SOURCE=200809L) XPG7
通过cmake
下载的文件git
需要进行编辑:
vi `find .deps | xargs grep -l XOPEN_SOURCE`
将任何-D_XOPEN_SOURCE=500
更改为-D_XOPEN_SOURCE=700
,然后重新运行cmake .
。这次应该可以成功完成。
然后运行gmake
。 (我发现gmake
在Solaris上几乎对所有开源项目都更好,因为许多开源项目都使用特定于GNU的make
扩展。)
现在,您可以修复遇到的所有损坏的源代码。
修复损坏的源代码
1
file aws-sdk-cpp/aws-cpp-sdk-core/source/platform/linux-shared/OSVersionInfo.cpp
具有以下错误代码:
Aws::String ComputeOSVersionString()
{
utsname name;
int32_t success = uname(&name);
Per POSIX,正确的类型是struct utsname
,而不仅仅是utsname
:
int uname(struct utsname *name);
AWS代码必须为:
Aws::String ComputeOSVersionString()
{
struct utsname name;
int success = uname(&name);
不,在给定this, umm, laugher的情况下,我绝对不会对AWS代码的质量印象深刻:
while (!feof(outputStream))
是的,一个实际的while (!feof())
循环...
2
文件aws-sdk-cpp/aws-cpp-sdk-mediaconvert/include/aws/mediaconvert/model/M2tsSegmentationMarkers.h使用的枚举值为EBP
,该枚举与the EBP
register #define
in /usr/include/sys/regset.h
冲突。
我只是将其更改为EBP_HASH
,因为这似乎与代码有些匹配:
vi `find . | xargs grep -l EBP`
3
文件aws-sdk-cpp/aws-cpp-sdk-route53domains/include/aws/route53domains/model/CountryCode.h创建与the ES
register #define
in /usr/include/sys/regset.h
冲突的枚举值ES
。我刚刚添加
#ifdef ES
#undef ES
#endif
,编译继续。我不知道#undef
是否可以破坏任何东西。
4
文件aws-sdk-cpp/aws-cpp-sdk-waf/include/aws/waf/model/GeoMatchConstraintValue.h的ES
,GS
和SS
枚举值与the ES
, GS
, and SS
register #define
's in /usr/include/sys/regset.h
冲突。
我再次添加了另外#undef
个:
#ifdef ES
#undef ES
#endif
#ifdef GS
#undef GS
#endif
#ifdef SS
#undef SS
#endif
我真的想知道为什么sys/regset.h
被#include
包含在AWS SDK的几乎所有内容中。
5
aws-sdk-cpp/aws-cpp-sdk-waf-regional/include/aws/waf-regional/model/GeoMatchConstraintValue.h中的问题相同。相同的解决方法,添加:
#ifdef ES
#undef ES
#endif
#ifdef GS
#undef GS
#endif
#ifdef SS
#undef SS
#endif
请注意,在SPARC硬件上进行编译意味着#define
中的sys/regset.h
值将完全不同,并且任何错误也将完全不同。
6
文件aws-sdk-cpp/aws-cpp-sdk-core-tests/utils/FileSystemUtilsTest.cpp错误地假定已定义POSIX NAME_MAX
值。每个the POSIX Pathname Variable Values standard(正在轰动我):
路径名变量值
以下列表中的值可以是 的实现,也可能因一个路径名而异。例如, 文件系统或目录可能具有不同的特征。
以下列表中一个符号常量的定义 在特定的
<limits.h>
标头中应省略 对应值等于或大于等于的实现 低于规定的最小值,但该值会根据 应用到的文件。特定值支持的实际值 路径名应由pathconf()
函数提供。
再次:“定义... 应省略 ...其中的值可以变化”。
AWS代码错误地假设NAME_MAX
是#define
的。
尽管只是使用255
或_POSIX_NAME_MAX
之类的方法,我只是硬编码了_XOPEN_NAME_MAX
的值来克服这一点。
7
假设std::shared_ptr
为8个字节,文件aws-sdk-cpp/ws-cpp-sdk-core-tests/http/HttpClientTest.cpp似乎是错误的。 This question and answer提供了一个很好的例子说明这是怎么回事。
我只是忽略了该错误,因为它只是一个测试,并继续执行gmake -i
,该错误已成功完成。