Инициализация и экспорт переменных Makefile

Старый вопрос, но для дальнейшего использования: это известная ошибка в Visual Studio 2015, как объясняется в последнем сообщении (7 января 2016 года) в этой теме MSDN Social.

Обходной путь для вашего примера выглядит следующим образом (я использовал свой метод как бесплатную функцию для простоты):

#include 
#include 
#include 
#include 

#if _MSC_VER >= 1900

std::string utf16_to_utf8(std::u16string utf16_string)
{
    std::wstring_convert, int16_t> convert;
    auto p = reinterpret_cast(utf16_string.data());
    return convert.to_bytes(p, p + utf16_string.size());
}

#else

std::string utf16_to_utf8(std::u16string utf16_string)
{
    std::wstring_convert, char16_t> convert;
    return convert.to_bytes(utf16_string);
}

#endif

int main()
{
    std::cout << utf16_to_utf8(u"Élémentaire, mon cher Watson!") << std::endl;

    return 0;
}

Надеемся, проблема будет исправлена ​​в будущих выпусках, в противном случае #if условие будет нуждаться в уточнении. UPDATE: нет, не зафиксировано в VS 2017. Поэтому я обновил препроцессор условным до >= 1900 (изначально был == 1900).

30
задан Pablo 15 May 2010 в 02:46
поделиться

2 ответа

Проблема в том, что export экспортирует переменную в подоболочки, используемые командами; он недоступен для расширения в других заданиях. Так что не пытайтесь получить это из окружающей среды вне правил.

somevar := apple
export somevar

update1 := $(shell perl -e 'print "method 1 $$ENV{somevar}\n"')
# Make runs the shell command, the shell does not know somevar, so update1 is "method 1 ".

update2 := perl -e 'print "method 2 $$ENV{somevar}\n"'
# Now update2 is perl -e 'print "method 2 $$ENV{somevar}\n"'

# Lest we forget:
update3 := method 3 $(somevar)

all:
    echo $(update1)
    $(update2)
    echo $(update3)
    perl -e 'print method 4 "$$ENV{somevar}\n"'
33
ответ дан 27 November 2019 в 22:10
поделиться

Запуск make-файла

foo:=apple
export foo
all:
        @echo ">"$(shell echo "$$foo")
        @echo ">""$$foo"

дает мне (с неопределенным foo в среде)

$ make
>
>apple

$ make foo=bar
>
>apple

$ export foo=bar; make
>bar
>apple

$ export foo=bar; make foo=bar
>bar
>bar

Попробуйте использовать форму в кавычках ( update: = "v = $$ somevar" ) и позволить оболочке обрабатывать расширение при запуске команды (вам все равно понадобится экспорт)

10
ответ дан 27 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: