ошибка / конфликт связывания для метода SendMessageA - PullRequest
1 голос
/ 05 июня 2019

Я построил aws-cpp-sdk следующим образом:

cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Debug -DBUILD_ONLY="s3;sqs;sns"

и после этого я побежал:

MSBuild.exe INSTALL.vcxproj

Который создал следующие файлы в каталоге "* C: \ Program Files \ aws-cpp-sdk-all *":

aws-c-common.dll
aws-c-event-stream.dll
aws-checksums.dll
aws-cpp-sdk-access-management.dll
aws-cpp-sdk-access-management.lib
aws-cpp-sdk-cognito-identity.dll
aws-cpp-sdk-cognito-identity.lib
aws-cpp-sdk-core.dll
aws-cpp-sdk-core.lib
aws-cpp-sdk-iam.dll
aws-cpp-sdk-iam.lib
aws-cpp-sdk-sns.dll
aws-cpp-sdk-sns.lib
aws-cpp-sdk-sqs.dll
aws-cpp-sdk-sqs.lib

aws-c-common.lib
aws-c-event-stream.lib
aws-checksums.lib

вместе с каталогом include . Я включил все заголовки и все библиотеки:

#include <aws/core/Aws.h>
#include <aws/core/auth/AWSCredentials.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/utils/logging/DefaultLogSystem.h>
#include <aws/core/utils/logging/AWSLogging.h>
#include <aws/sns/model/PublishRequest.h>
#include <aws/sns/model/PublishResult.h>
#include <aws/s3/model/ListObjectsRequest.h>
#include <aws/core/utils/Outcome.h>
#include <aws/s3/model/Bucket.h>
#include <aws/sqs/SQSClient.h>
#include <aws/sqs/model/SendMessageRequest.h>

#pragma comment( lib, "aws-cpp-sdk-core.lib"         )
#pragma comment( lib, "aws-c-common.lib"         )
#pragma comment( lib, "aws-c-event-stream.lib"   )
#pragma comment( lib, "aws-checksums.lib"        )

#pragma comment( lib, "aws-cpp-sdk-core.lib"     )
#pragma comment( lib, "aws-cpp-sdk-iam.lib"  )
#pragma comment( lib, "aws-cpp-sdk-sqs.lib"      )
#pragma comment( lib, "aws-cpp-sdk-sns.lib"      )
#pragma comment( lib, "aws-cpp-sdk-cognito-identity.lib"         )
#pragma comment( lib, "aws-cpp-sdk-access-management.lib"        )

...

Aws::SQS::SQSClient                 sqs;
Aws::SQS::Model::SendMessageRequest sm_req;

sm_req.SetQueueUrl( "https://sqs.amazonaws.com/123123" );
sm_req.SetMessageBody( stringJSONFormatted.c_str() );

auto sm_out = sqs.SendMessage(sm_req);
if (sm_out.IsSuccess())
    Logger::Log( "Message sent successfully to the AWS SQS" );
else
    Logger::Log( "FAILED to send message send to AWS SQS" );

Но всякий раз, когда я строю это, я получаю:

__declspec(dllimport) public: virtual class Aws::Utils::Outcome<class Aws::SQS::Model::SendMessageResult,class Aws::Client::AWSError<enum Aws::SQS::SQSErrors> > 
__cdecl Aws::SQS::SQSClient::SendMessageA(class Aws::SQS::Model::SendMessageRequest const &)const 
(__imp_?SendMessageA@SQSClient@SQS@Aws@@UEBA?AV?$Outcome@VSendMessageResult@Model@SQS@Aws@@V?$AWSError@W4SQSErrors@SQS@Aws@@@Client@4@@Utils@3@AEBVSendMessageRequest@Model@23@@Z) 
fatal error LNK1120: 1 unresolved externals

Я перепробовал все, что смог найти, я даже много раз перестраивал библиотеку с разными аргументами, но проблема все еще остается. кажется, это как-то связано с именем AWS :: SQSClient :: SendMessageA , конфликтующим с каким-то методом Windows (но я, вероятно, ошибаюсь). Было одно решение, которое гласило: если я определю это перед заголовками AWS , оно должно создать:

#undef GetObject

но все та же ошибка. Любые предложения, пожалуйста?

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вы можете взглянуть на это сообщение в блоге для подробного объяснения.

Вы можете попробовать:

#undef SendMessage

до включая заголовки AWS (аналогично #undef GetObject, который вы указали в своем вопросе).

1 голос
/ 05 июня 2019

Проблема заключается в том, что системные заголовки Windows определяют макрос SendMessage для расширения до SendMessageA или SendMessageW в зависимости от наличия макроса UNICODE.

Это делается для много функций в Windows API, что, конечно, означает, что будут конфликты с другим кодом, использующим символы, которые в Windows оказываются макросами.

Одним из возможных решений является #undef SendMessage после #include <windows.h>. Что может быть невозможно, если код, который вы пытаетесь создать, получен от третьей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...