Символы уже определили ошибку при компиляции вывода сборки из Visual Studio - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время используется Microsoft Visual Studio Community 2019 версии 16.4.4 и компилируется проект C.

Я хочу иметь возможность выводить сборку из VS, вносить изменения в сборку и затем компилировать измененную сборку в исполняемый файл. Ниже я расскажу о своих попытках следовать инструкциям из предыдущего вопроса SO, но если есть альтернатива (даже без использования VS), я был бы признателен за эти предложения.

В качестве теста я использовал простой "привет Программа "world":

#include <stdio.h>
int main(int argc, char* argv) {
    printf("Hello world\n");
    return 0;
}

Я пытался скомпилировать эту программу, следуя инструкциям, данным этим ответом , но я получаю следующие ошибки:

LNK2005 ___local_stdio_printf_options уже определено в helloworld.obj

LNK1169 найден один или несколько кратно определенных символов

Похоже, что VS на самом деле компилирует сборку в объектные файлы, но компоновщик говорит, что "___local_stdio_printf_options "символ уже определен во время соединения. Когда я оглядываюсь назад на вывод кода ассемблера от VS, это выглядит так:

___local_stdio_printf_options PROC          ; COMDAT
; File C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\corecrt_stdio_config.h
; Line 86
    push    ebp
    mov ebp, esp
; Line 88
    mov eax, OFFSET ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9 ; `__local_stdio_printf_options'::`2'::_OptionsStorage
; Line 89
    pop ebp
    ret 0
___local_stdio_printf_options ENDP

Так что выглядит , как решение для этого может быть для предотвращения компилятора VS от определить ___local_stdio_printf_options или изменить настройку компоновщика, чтобы каким-либо образом принять этот стиль кодирования. Я не знаю, почему VS будет производить код, который определяет внешние символы, как это. Буду очень признателен за любую помощь.

...