2016-06-10 2 views
0

Так что мне нужно приложение, защищенное от несанкционированного доступа. Я сделал это, но когда я пытаюсь запустить его внутри виртуальной машины без окна 7, у меня есть много ошибок, таких как msvcp140.dll и т. Д. И т. Д. , поэтому я искал Google, чтобы статически связать их. Я обнаружил, что должен изменить его в вариантах генерации кода проекта, поэтому я и сделал. У меня также есть SFML, связанный статически. Проблема заключается в том, я получаю много ошибок компоновщика отсылая к SFML как:(Visual Studio) Множество ошибок компоновщика при попытке связать библиотеки микрософт статически с SFML-библиотеками

sfml-system-s.lib(String.cpp.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main.obj 

Я не уверен, почему это происходит, поэтому я прошу помощи здесь

+0

Самый простой способ - просто скомпилировать его с другим компилятором (см. Инструкции на веб-сайте SFML), чтобы вам не нужны библиотеки Microsoft, которые требуется компилятору Visual Studio. Или просто включите эти .dll с вашим приложением, если вы не ограничены только своим исполняемым файлом. – Noctiphobia

+0

@Noctiphobia проблема в том, что мне нужно использовать визуальную студию, потому что мое приложение использует как SFML, так и winapi (winapi используется для определения того, как выглядит окно sfml здесь) , поэтому мне нужно использовать визуальную студию теперь я просто думаю, что плохо перекомпилировать sfml с помощью cmake но у меня есть компилятор, не найденный компилятор anc cxx не найден, im не уверен, почему, но я постараюсь выяснить его –

ответ

0

Я был уверен, что у меня была ваша проблема фигурный просто прочитав сообщение об ошибке, подумав о термине «RuntimeLibrary» и как он говорил о несоответствии между «DynamicRelease» и «StaticRelease». Моя интуиция заявила, что вы пытались объединить библиотеку, которая была скомпилирована с таргетингом на одну версию CRT с приложением, которое предназначалось для другой версии CRT. Учитывая, что «MD» и «MT» - это компиляторы, которые управляют тем, динамически ли вы статически связываете время выполнения, это тоже очень хороший ключ.

Но, чтобы быть уверенным, я принял фактический код ошибки (LNK2038) и посмотрел его в the documentation. Конечно же, она содержит отрывок, который описывает проблему именно:

библиотека времени исполнения

Указывает версию ++ стандартной библиотеки C и C выполнения, которая используется приложением или библиотекой. Код, который использует одну версию стандартной библиотеки C++ или C, несовместим с кодом, который использует другую версию. Для получения дополнительной информации см. /MD, /MT, /LD (Use Run-Time Library).

Линкер стал шикарным на протяжении многих лет. Он пытается защитить вас от серьезной ошибки. Все модули, которые связаны друг с другом, должны быть скомпилированы для таргетинга на библиотеку времени выполнения того же типа. Если вы хотите, чтобы приложение статически привязывалось к CRT (/ MT), вам также необходимо также установить ссылку на библиотеку (/ MT).
Свойства проекта → Свойства конфигурации → C/C++ → Генерация кода → Библиотека времени выполнения.
Не забудьте перестроить все.

+0

Я не уверен, что мне делать, объяснение немного неясно для меня. –

+0

В свойствах проекта → Свойства конфигурации → C/C++ → Генерация кода → Библиотека времени выполнения i/mt проверена, и я также использую статическую версию sfml –

+0

Вы должны изменить способ компиляции * библиотеки *, а не только приложения. В этом-то и дело. –

Смежные вопросы