AWS CPP SDK 编译链接

728 x 394960 x 520

AWS scheme

modify date:2018.03.22

[TOC]

AWS 库编译

To use the AWS SDK for C++, you need:

  • Visual Studio 2013 or later

    ​ Note:Visual Studio 2013 doesn't provide default move constructors and operators. Later versions of Visual Studio provide a standards-compliant compiler.

  • or GNU Compiler Collection (GCC) 4.9 or later

  • or Clang 3.3 or later

  • A minimum of 4 GB of RAM

(-dev packages) for libcurl, libopenssl, libuuid, zlib

cmake version > 3.0

unix 编译依赖

  • libz
  • curl
  • openssl
  • libuuid

Ubuntu 安装开发库 sudo apt-get install libcurl4-openssl-dev libssl-dev uuid-dev zlib1g-dev libpulse-dev

openssluuidzlibcurl

CentOS

安装新版本 gcc 和 gdb

# 1. Install a package with repository for your system:# On CentOS, install package centos-release-scl available in CentOS repository:$ sudo yum install centos-release-scl# On RHEL, enable RHSCL repository for you system:$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms# 2. Install the collection:$ sudo yum install devtoolset-7# 3. Start using software collections:$ scl enable devtoolset-7 bash

安装 cmake

yum install llvm-toolset-7

ccmake-命令行界面,交互模式。

安装 libz,curl,openssl 和 libuuid 的 devel 版

只编译部分模块

通过 cmake 配置生成模块,cmake /mnt/hd03.d/xdu.d/aws/source/aws-sdk-cpp -DBUILD_ONLY="s3"

  • BUILD_SHARED_LIBS,是否生成动态库。ON 动态库,OFF 静态库
  • CMAKE_BUILD_TYPE,生成类型,Relaese,Debug -DCMAKE_BUILD_TYPE=Release
cmake /mnt/hd03.d/xdu.d/aws/source/aws-sdk-cpp  -DBUILD_ONLY="core;s3;transfer"  -DBUILD_SHARED_LIBS="OFF" -DCMAKE_BUILD_TYPE=Release

动态库

cmake /mnt/hd03.d/xdu.d/aws/source/aws-sdk-cpp  -DBUILD_ONLY="core;s3;transfer"  -DBUILD_SHARED_LIBS="ON" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC

链接

动态链接需要定义 USE_IMPORT_EXPORT

If you dynamically link to the SDK you will need to define the USE_IMPORT_EXPORT symbol for all build targets using the SDK

GCC: what are the --start-group and --end-group command line options?

It is for resolving circular dependences between several libraries

Impossible to link static libraries with circular dependencies

在 aws 的静态库中,有循环引用问题。

In a project we have multiple static libraries (build using cdt), two of which have circular dependencies to each other, that link together into an executable (also built using cdt).

With the "GCC C Linker" selected it's impossible to build that file. The linker complains about missing references when the static libraries are simply added in the "C/(C++ Build -> Settings -> GCC C Linker -> Libraries" tab, because references of the library that appears last on the generated command line has undefined references.

The solution would be to add "--start-group -lX -lY --end-group" to the linker command line after the list of the object files. But that's simply not possible. The additional linker options (both the "Linker flags" and "Other options (-Xlinker [option])" fields) that can be specified on the "GCC C Linker -> Miscellaneous" tab are added to the command line before the object, which has essentially no effect.

N.B. In our project I have installed a (dirty) workaround: I have added the linker options (-Wl,--start-group,-lX,-lY,--end-group) to the "Other objects" field (and added a dummy make rule in makefile.init so make won't complain about it) to force CDT to put it after the list of objects. It works but is really ugly.

使用 GCC 可将链接参数传递给链接器使用 -Wl,--start-group-Wl,--end-group

-Wl,--start-group  -laws-cpp-sdk-core -laws-cpp-sdk-s3 -laws-cpp-sdk-transfer-Wl,--end-group
//linux makefileCC = g++CCFLAGS = -DNDEBUG  -std=c++11 -O0INCLUDE := -I../LDFLAGS := -L../aws/bin/linux/static -Wl,-rpath ./ -Wl,-rpath ../aws/bin/linux/dynamicLIBS  := -lcurl -pthread -lcrypto -Wl,--start-group -laws-cpp-sdk-core -laws-cpp-sdk-s3 -laws-cpp-sdk-transfer -Wl,--end-groupmake: main        rm *.o        @echo successmain:        $(CC) $(CCFLAGS) $(INCLUDE) -c -o main.o main.cpp        $(CC) $(CCFLAGS) $(INCLUDE) $(LDFLAGS) -o transfer main.o $(LIBS)

Mac 下不需要 -pthread -lcrypto

查看动态库依赖

readelf -d libbar.so

$ readelf -d ../aws/bin/linux/dynamic/libaws-cpp-sdk-transfer.soDynamic section at offset 0x29c38 contains 36 entries:  Tag        Type                         Name/Value 0x0000000000000001 (NEEDED)             Shared library: [libaws-cpp-sdk-s3.so] 0x0000000000000001 (NEEDED)             Shared library: [libaws-cpp-sdk-core.so] 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4] 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.10] 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.10] 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1] 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6] 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6] 0x000000000000000e (SONAME)             Library soname: [libaws-cpp-sdk-transfer.so]

从静态库合并为动态库

gcc -shared -o libmerge.so -Wl,--whole-archive libaws-cpp-sdk-core.a libaws-cpp-sdk-s3.a libaws-cpp-sdk-transfer.a -Wl,--no-whole-archive

windows 编译链接 aws lib

使用 cmake 生成工程,到生成库目录下,此处打开PowerShell 然后运行指令

& "E:\Software Install\cmake-3.11.0-rc3-win64-x64\cmake-3.11.0-rc3-win64-x64\bin\cmake" E:\libs\aws-sdk-cpp-1.4.11 -DBUILD_ONLY="transfer" -DBUILD_SHARED_LIBS=ON -DSTATIC_LINKING=1 -DTARGET=WINDOWS -G "Visual Studio 15 2017"

windows 静态链接 aws static lib 需要依赖于几个系统静态库

 winhttp.lib wininet.lib bcrypt.lib userenv.lib Version.lib

静态链接出现 GetObjectA/GetObjectW 错误,由于 wingdi.h 中定义了

//wingdi.h#ifdef UNICODE#define GetObject  GetObjectW#else#define GetObject  GetObjectA#endif // !UNICODE

S3Client.h 被包含之前取消 GetObject 定义

//on windows visual studio//undef GetObject to avoid marco conflict#if defined _WIN32 && defined GetObject#undef GetObject#endif
(0)

相关推荐