Skip to content
This repository has been archived by the owner on Jan 16, 2024. It is now read-only.

FinallyGuard included by multiple libraries; Leads to linking errors #1517

Closed
jbfitb opened this issue Oct 8, 2019 · 3 comments
Closed

FinallyGuard included by multiple libraries; Leads to linking errors #1517

jbfitb opened this issue Oct 8, 2019 · 3 comments

Comments

@jbfitb
Copy link

jbfitb commented Oct 8, 2019

Briefly summarize your issue:

  • Compiling for iOS
  • Trying to link static libraries into a single executable
  • Getting linker errors:
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::~FinallyGuard()' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(LocaleWakeWordsSetting.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::~FinallyGuard()' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(LocaleWakeWordsSetting.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::FinallyGuard(std::__1::function<void ()> const&)' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(LocaleWakeWordsSetting.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::FinallyGuard(std::__1::function<void ()> const&)' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(LocaleWakeWordsSetting.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::~FinallyGuard()' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(ReportStateHandler.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::~FinallyGuard()' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(ReportStateHandler.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::FinallyGuard(std::__1::function<void ()> const&)' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(ReportStateHandler.cpp.o)
duplicate symbol 'alexaClientSDK::avsCommon::utils::error::FinallyGuard::FinallyGuard(std::__1::function<void ()> const&)' in:
    <redacted_path>(AlertScheduler.cpp.o)
    <redacted_path>(ReportStateHandler.cpp.o)
ld: 8 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Research into the Issue

  • It looks like FinallyGuard has its implementation in its header file
  • Before 1.15, FinallyGuard was only used in AlertScheduler.cpp so this wasn't an issue.
  • As of 1.15, FinallyGuard is used by three objects: AlertScheduler.cpp.o, LocaleWakeWordsSetting.cpp.o, and ReportStateHandler.cpp.o
  • The FinallyGuard symbols are now referenced in libAVSSystem, libAlerts, and libDeviceSettings
  • When linking two or more of these three libraries, there are errors due to duplicate symbols.

Possible Solution

It seems that creating a FinallyGuard.cpp and removing the implementation from the header file fixes this issue:

FinallyGuard.h

#ifndef ALEXA_CLIENT_SDK_AVSCOMMON_UTILS_INCLUDE_AVSCOMMON_UTILS_ERROR_FINALLYGUARD_H_
#define ALEXA_CLIENT_SDK_AVSCOMMON_UTILS_INCLUDE_AVSCOMMON_UTILS_ERROR_FINALLYGUARD_H_

#include <functional>

namespace alexaClientSDK {
namespace avsCommon {
namespace utils {
namespace error {

/**
 * Define a class that can be used to run a function when the object goes out of scope.
 *
 * This simulates try-finally statements. The following structure:
 *
 * @code
 * try {
 *   <try_block>
 * } finally {
 *   <finally_block>
 * }
 * @endcode
 *
 * can be replaced by:
 *
 * @code
 *   FinallyGuard guard { []{ <finally_block> }};
 *   <try_block>
 * @endcode
 */
class FinallyGuard {
public:
    /**
     * Constructor.
     *
     * @param finallyFunction The function to be executed when the object goes out of scope.
     */
    FinallyGuard(const std::function<void()>& finallyFunction);

    /**
     * Destructor. Runs @c m_function during destruction.
     */
    ~FinallyGuard();

private:
    /// The function to be run when this object goes out of scope.
    std::function<void()> m_function;
};

}  // namespace error
}  // namespace utils
}  // namespace avsCommon
}  // namespace alexaClientSDK
#endif  // ALEXA_CLIENT_SDK_AVSCOMMON_UTILS_INCLUDE_AVSCOMMON_UTILS_ERROR_FINALLYGUARD_H_

FinallyGuard.cpp

#include "AVSCommon/Utils/Error/FinallyGuard.h"

namespace alexaClientSDK {
namespace avsCommon {
namespace utils {
namespace error {

FinallyGuard::FinallyGuard(const std::function<void()>& finallyFunction) : m_function{finallyFunction} {
}

FinallyGuard::~FinallyGuard() {
    if (m_function) {
        m_function();
    }
}

}  // namespace error
}  // namespace utils
}  // namespace avsCommon
}  // namespace alexaClientSDK

AVSCommon/CMakeLists.txt

+     Utils/src/FinallyGuard.cpp
@scotthea-amazon
Copy link
Contributor

Hello @jbfitb,

This is definitely a bug. Thank you for reporting this issue!

Best regards,
-SWH

@caleighatamazon
Copy link
Contributor

Closing this issue for now. We're tracking the bug internally. Please feel free to re-open the issue if you have more questions or concerns.

caleighatamazon added a commit that referenced this issue Dec 10, 2019
Changes in this update:

**Enhancements**

- Added support for [captions for TTS](https://developer.amazon.com/docs/avs-device-sdk/features.html#captions). This enhancement allows you to print onscreen captions for Alexa voice responses.
- Added support for [SpeechSynthesizer Interface 1.3](https://developer.amazon.com/docs/alexa-voice-service/speechsynthesizer.html). This interface supports the new `captions` parameter.
- Added support for [AudioPlayer Interface 1.3](https://developer.amazon.com/docs/alexa-voice-service/audioplayer.html). This interface supports the new `captions` parameter.
- Added support for [Interaction Model 1.2](https://developer.amazon.com/docs/alexa-voice-service/interactionmodel-interface.html).
- Added support for [System 2.0](https://developer.amazon.com/en-US/docs/alexa/alexa-voice-service/system.html).
- Added support for Alarm Volume Ramp. This feature lets you to fade in alarms for a more pleasant experience. You enable alarm volume ramp in the sample app through the settings menu.
- Added support for using certified senders for URI path extensions. This change allows you to specify the URI path extension when sending messages with [`CertifiedSender::sendJSONMessage`](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1certified_sender_1_1_certified_sender.html#a4c0706d79717b226ba77d1a9c3280fe6).
- Added new [`Metrics`](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1avs_common_1_1utils_1_1_metrics.html) interfaces and helper classes. These additions help you create and consume [`Metrics`](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1avs_common_1_1utils_1_1_metrics.html) events.
 - **Interfaces** - `MetricRecorderInterface`, `MetricSinkInterface`.
 - **Helper Classes** - `DataPointStringBuilder`, `DataPointCounterBuilder`, `DataPointDurationBuilder`, `MetricEventBuilder`.

- Added support for the following AVS [endpoint](../avs-device-sdk/endpoints.html) controller capabilities:
 - [Alexa.ModeController](https://developer.amazon.com/docs/alexa-voice-service/alexa-modecontroller.html)
 - [Alexa.RangeController](https://developer.amazon.com/docs/alexa-voice-service/alexa-rangecontroller.html)
 - [Alexa.PowerController](https://developer.amazon.com/docs/alexa-voice-service/alexa-powercontroller.html)
 - [Alexa.ToggleController](https://developer.amazon.com/docs/alexa-voice-service/alexa-togglecontroller.html)

- Added `PowerResourceManagerInterface`. This interface allows the SDK to control power resource levels for components such as the `AudioInputProcessor` and `SpeechSynthesizer`.
- Added `AlexaInterfaceCapabilityAgent`. This Capability Agent handles common directives and endpoint controller capabilities support by [`Alexa.AlexaInterface`](../alexa-voice-service/alexa.html).
- Added `AlexaInterfaceMessageSenderInterface`. This interface is required to send common events defined by the `Alexa.AlexaInterface` interface.
- Added `BufferingComplete` to [`MediaPlayerObserverInterface`](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1avs_common_1_1utils_1_1media_player_1_1_media_player_observer_interface.html). This method helps improve performance in poor networking conditions by making sure `MediaPlayer` pre-buffers correctly.
- Added `SendDTMF` to `CallManagerInterface`. This method allows you to send DTMF tones during calls.

**New build options**

- CAPTIONS
 - **ADDED** [`CAPTIONS`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#captions)
 - **ADDED** [`LIBWEBVTT_LIB_PATH`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#captions)
 - **ADDED** [`LIBWEBVTT_INCLUDE_DIR`](https://developer.amazon.com/docs//avs-device-sdk/cmake-parameters.html#captions)
- METRICS
 - **ADDED** [`METRICS`](https://developer.amazon.com/docs//avs-device-sdk/cmake-parameters.html#metrics)
- ENDPONTS
 - **ADDED** [`ENABLE_ALL_ENDPOINT_CONTROLLERS`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#endpoints)
 - **ADDED** [`ENABLE_POWER_CONTROLLER`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#endpoints)
 - **ADDED** [`ENABLE_TOGGLE_CONTROLLER`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#endpoints)
 - **ADDED** [`ENABLE_RANGE_CONTROLLER`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#endpoints)
 - **ADDED** [`ENABLE_MODE_CONTROLLER`](https://developer.amazon.com/docs/avs-device-sdk/cmake-parameters.html#endpoints)

**New dependencies**

- To use captions, you must install a [new dependency](https://developer.amazon.com/docs/avs-device-sdk/dependencies) &ndash; the [libwebvtt parsing library](https://github.com/alexa/webvtt). Webvtt is a C/C++ library for interpreting and authoring conformant WebVTT content. WebVTT is a caption and subtitle format designed for use with HTML5 audio and video elements.

**Bug fixes**

- Fixed [`MimeResponseSink::onReceiveNonMimeData`](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1acl_1_1_mime_response_sink.html) [data issue](#1519) that returned invalid data.
- Fixed [data type issue](#1519) that incorrectly used `finalResponseCode` instead of [`FinalResponseCodeId`](https://github.com/alexa/avs-device-sdk/blob/master/AVSCommon/Utils/src/LibcurlUtils/LibCurlHttpContentFetcher.cpp#L370).
- Fixed [`UrlContentToAttachmentConverter`](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1playlist_parser_1_1_url_content_to_attachment_converter.html) issue that used the incorrect range parameter.
- Fixed `FinallyGuard` [linking issue](#1517) that caused problems compiling the SDK on iOS.
- Fixed a [Bluetooth Capability Agent](https://alexa.github.io/avs-device-sdk/classalexa_client_s_d_k_1_1capability_agents_1_1bluetooth_1_1_bluetooth.html) bug that prevented devices from initializing.

**Known Issues**

* The WebVTT dependency required for `captions` isn't supported for Windows/Android.
* Music playback history isn't displayed in the Alexa app for certain account and device types.
* When using Gnu Compiler Collection 8+ (GCC 8+), `-Wclass-memaccess` triggers warnings. You can ignore these, they don't cause the build to fail.
* Android error `libDefaultClient.so not found` might occur. Resolve this by upgrading to ADB version 1.0.40.
* If a device loses a network connection, the lost connection status isn't returned via local TTS.
* ACL encounters issues if it receives audio attachments but doesn't consume them.
* `SpeechSynthesizerState` uses `GAINING_FOCUS` and `LOSING_FOCUS` as a workaround for handling intermediate states.
* Media steamed through Bluetooth might abruptly stop. To restart playback, resume the media in the source application or toggle next/previous.
* If a connected Bluetooth device is inactive, the Alexa app might indicates that audio is playing.
* The Bluetooth agent assumes that the Bluetooth adapter is always connected to a power source. Disconnecting from a power source during operation isn't yet supported.
* When using some products, interrupted Bluetooth playback might not resume if other content is locally streamed.
* `make integration` isn't available for Android. To run Android integration tests, manually upload the test binary and input file and run ADB.
* Alexa might truncate the beginning of speech when responding to text-to-speech (TTS) user events. This only impacts Raspberry Pi devices running Android Things with HDMI output audio.
* A reminder TTS message doesn't play if the sample app restarts and loses a network connection. Instead, the default alarm tone plays twice.
* `ServerDisconnectIntegratonTest` tests are disabled until they are updated to reflect new service behavior.
* Bluetooth initialization must complete before connecting devices, otherwise devices are ignored.
* The `DirectiveSequencerTest.test_handleBlockingThenImmediatelyThenNonBockingOnSameDialogId` test fails intermittently.
* On some devices, Alexa gets stuck in a permanent listening state. Pressing `t` and `h` in the Sample App doesn't exit the listening state.
* Exiting the settings menu doesn't provide a message to indicate that you're back in the main menu.
@scotthea-amazon
Copy link
Contributor

Hello @jbfitb,

This issue has been fixed in the 1.17 release. Thank you again (and again) for your help!

Best regards,
-SWH

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants