Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ? / 22 сообщений из 22, страница 1 из 1
21.03.2016, 03:22
    #39196702
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Всем привет.

Ковыряюсь с известной криптографической библиотекой libsodium (форк NaCl )

В подпапке libsodium\builds\msvc\vs2013 лежит libsodium.sln, с помощью которого можно построить библиотеку либо как dynamic library(.dll), либо как static library(.lib).

Интересует построение именно .dll. Все строится, работает, но при выполнении требует установку "рантайма" (Redistributable Package).
Хотелось бы избежать этого.

Попытка решения "в лоб" путем установки ключа компиляции /MT (вместо /MD) вызывает ошибки линковки:

Ошибки1>pwhash_scryptsalsa208sha256.obj : error LNK2019: unresolved external symbol __imp__memchr referenced in function _crypto_pwhash_scryptsalsa208sha256_str_verify
1>crypto_scrypt-common.obj : error LNK2019: unresolved external symbol __imp__strchr referenced in function _decode64_one
1>utils.obj : error LNK2001: unresolved external symbol __imp__strchr
1>randombytes_salsa20_random.obj : error LNK2019: unresolved external symbol __imp___ftime64 referenced in function _sodium_hrtime

Вот, я нашел еще одного "страдальца", которому ответили:

Ответили:Looks like you are trying to build a dynamic library (your configuration is ReleaseDLL), but at the same time selecting the /MT runtime which is only for static libraries.


...и посоветовали:

...и посоветовали:Just select a different configuration, such as ReleaseLIB. The output will be a static library (.LIB) using the /MT runtime.

Однако, нужна именно .dll.

Может, я что-то недопонимаю, и /MT действительно нельзя использовать при построении .dll?
...
Рейтинг: 0 / 0
21.03.2016, 05:32
    #39196712
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
чччДМожет, я что-то недопонимаю, и /MT действительно нельзя использовать при построении .dll?
Попробуйте /MT + /NODEFAULTLIB + явная линковка с libcmt.lib

Хотя по идее /MT это оно же и есть.
...
Рейтинг: 0 / 0
21.03.2016, 05:34
    #39196714
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Хотя ошибка "unresolved external symbol __imp__strchr" говорит о том что компиляция была с ключем /MD.
Возможно, надо вручную удалить .obj и пересобрать с ключем /MT
...
Рейтинг: 0 / 0
21.03.2016, 08:55
    #39196737
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
чччД,
те, Можно ли линковать твою .dll с CRT в виде статической библиотеки (.lib)?

Нет, нельзя.
...
Рейтинг: 0 / 0
21.03.2016, 11:27
    #39196885
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivчччД,
те, Можно ли линковать твою .dll с CRT в виде статической библиотеки (.lib)?

Нет, нельзя.
ОК, спасибо. Буду использовать redistributable pack.
...
Рейтинг: 0 / 0
21.03.2016, 12:43
    #39197024
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivте, Можно ли линковать твою .dll с CRT в виде статической библиотеки (.lib)?

Нет, нельзя.
Можно ссылку на доку.

Давно на C не писал, но в свое время в MS VS 6.0 собирал проект (DLL с MFC статическая линковка), проблем не было.

Вроде и по https://msdn.microsoft.com/ru-ru/library/2kzt1wy3(v=vs.110).aspx тоже вполне можно.

Anatoly MoskovskyХотя ошибка "unresolved external symbol __imp__strchr" говорит о том что компиляция была с ключем /MD.
Возможно, надо вручную удалить .obj и пересобрать с ключем /MT
+
...
Рейтинг: 0 / 0
21.03.2016, 14:18
    #39197158
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivте, Можно ли линковать твою .dll с CRT в виде статической библиотеки (.lib)?

Нет, нельзя.
Не придумывайте. Можно.
...
Рейтинг: 0 / 0
21.03.2016, 19:25
    #39197457
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Leonid KudryavtsevMasterZivте, Можно ли линковать твою .dll с CRT в виде статической библиотеки (.lib)?

Нет, нельзя.
Можно ссылку на доку.

Давно на C не писал, но в свое время в MS VS 6.0 собирал проект (DLL с MFC статическая линковка), проблем не было.



Проблем может не быть, но так делать нельзя.
...
Рейтинг: 0 / 0
21.03.2016, 19:25
    #39197458
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Anatoly MoskovskyMasterZivте, Можно ли линковать твою .dll с CRT в виде статической библиотеки (.lib)?

Нет, нельзя.
Не придумывайте. Можно.

Тебе -- можно. Ему -- нельзя.
Доволен ?
...
Рейтинг: 0 / 0
21.03.2016, 19:27
    #39197459
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivПроблем может не быть, но так делать нельзя.

Почему же?

p.s. хотя вроде по поводу этого уже спорили и каждый остался при своем мнении
...
Рейтинг: 0 / 0
21.03.2016, 21:24
    #39197499
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZiv Тебе -- можно. Ему -- нельзя.
Доволен ?
1) Потенциальные проблемы не имеют отношения к текущему топику где обсуждаются ошибки сборки, которых не должно быть.

2) Т.к. обсуждаемая либа - на чистом С, то надо очень постараться чтобы не взлетело со статическим рантаймом.
...
Рейтинг: 0 / 0
21.03.2016, 22:24
    #39197518
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Anatoly Moskovsky,

Клиент очевидно не понимает что делает.

Хотя те 3 функции которые вылезли у него в линковке, вряд ли будут источником проблем в дальнейшем.
...
Рейтинг: 0 / 0
21.03.2016, 22:57
    #39197529
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZiv Ему -- нельзя.
SiemarglКлиент очевидно не понимает что делает
Каким-то снобизмом попахивает )))
...
Рейтинг: 0 / 0
21.03.2016, 23:19
    #39197537
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Что ты, обычная закрытая секта =)
...
Рейтинг: 0 / 0
22.03.2016, 11:28
    #39197800
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Leonid KudryavtsevMasterZivПроблем может не быть, но так делать нельзя.

Почему же?

p.s. хотя вроде по поводу этого уже спорили и каждый остался при своем мнении


ребята, на вопрос "почему" почитайте хотя бы ту же документацию по компилятору в MSDN.
Там в общем четко написано, что если ты строишь .dll, то надо использовать динамический рантайм, потому что у приложения и твоей .dll должен быть один и тот же рантайм, а не несколько.

Дальше вы можете не верить официальной документации, и искать приключения себе на задницу, тут, безусловно, у вас полная свобода, потому что мы в конце концов в свободной стране живем...
...
Рейтинг: 0 / 0
22.03.2016, 11:57
    #39197826
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivТам в общем четко написано

можно для тупых ссылку

а то лично я "смотрю в книгу и вижу фигу"
...
Рейтинг: 0 / 0
22.03.2016, 15:23
    #39198062
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Leonid KudryavtsevMasterZivТам в общем четко написано

можно для тупых ссылку

а то лично я "смотрю в книгу и вижу фигу"

https://msdn.microsoft.com/ru-ru/library/abx4dbyh(v=vs.100).aspx

MSDNBecause a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood . For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. The static library provides a proxy between your managed code and the native CRT. You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. Use the dynamically-linked libraries (/MD or /MDd) instead.


P.S. нашёл за 5 минут, больше у меня и не было, так что и вы при сильном желании могли бы...
...
Рейтинг: 0 / 0
22.03.2016, 15:45
    #39198097
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivТам в общем четко написано, что если ты строишь .dll, то надо использовать динамический рантайм, потому что у приложения и твоей .dll должен быть один и тот же рантайм, а не несколько.

Меня давным-давно на курсах английскому учили, что в английском есть выражения:

HAVE TO
SHOULD

Фраза "it is not recommended" не мой взгляд, это полностью НЕ have to.

Мало того, все это начинается с "DLL built by linking to a static CRT will have its own CRT state"

Так блин, ребята, я ровно за тем статически и линкую. Т.к. мои DLL обычно используются в сторонних (НЕ моих) программах и мне нафиг не нужно, что бы мой код менял какое либо состояние стороннего (неизвестного) приложения и так же не нужно, что бы какие либо операции там, меняли мое состояние.
...
Рейтинг: 0 / 0
22.03.2016, 18:31
    #39198258
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Leonid KudryavtsevMasterZivТам в общем четко написано, что если ты строишь .dll, то надо использовать динамический рантайм, потому что у приложения и твоей .dll должен быть один и тот же рантайм, а не несколько.

Меня давным-давно на курсах английскому учили, что в английском есть выражения:

HAVE TO
SHOULD

Фраза "it is not recommended" не мой взгляд, это полностью НЕ have to.

Мало того, все это начинается с "DLL built by linking to a static CRT will have its own CRT state"

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

Логика безумная.
Но если хочешь на свою попу приключений -- вперёд, я уже написал.
...
Рейтинг: 0 / 0
22.03.2016, 18:47
    #39198274
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
MasterZivЛогика безумная.
Но если хочешь на свою попу приключений -- вперёд, я уже написал.
Не знаю, в чем безумная. > 15 лет DLL на Borland C, MS C клепал под FoxPro 2.6, Access, Oracle Forms, Macromedia Director (ActiveX), Java и т.д.

Никаких проблем не замечал.

Просто интересно, как при логике "у приложения и твоей .dll должен быть один и тот же рантайм" люди умудряются DLL "внезапно" создавать даже на других компиляторах.

Как при Вашей логике, делать DLL для сторонних приложений? Например для Java старых версий. Как тут обеспечить "у приложения и твоей .dll должен быть один и тот же рантайм"?

===

Проблема могут быть. Например при использование MFC. Но, опять таки, нужно внимательно читать документацию и, по факту, проблемы исчезают. Когда встраивал MFC DLL в Oracle Forms была пара веселых недель, когда разбирался как правильно слинковать. Но когда корректно написал код и слинковал статистически - все проблемы исчезли. У корневого приложение "свое MFC", у DLL "свое MFC". Т.к. Windows и есть Windows, взаимодействовать между окнами через чистый HWND никто не запрещает.
...
Рейтинг: 0 / 0
22.03.2016, 19:26
    #39198297
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
>Никаких проблем не замечал.

значит, тебе везло...

>Просто интересно, как при логике "у приложения >и твоей .dll должен быть один и тот же рантайм" >люди умудряются DLL "внезапно" создавать >даже на других компиляторах.

иногда разные компиляторы имеют один и тот же рантайм...

> Как тут обеспечить "у приложения и твоей .dll >должен быть один и тот же рантайм"?

ты прав, это не всегда возможно...

===

>Проблема могут быть. Например при >использование MFC.

MFC -то тут при чем?
"MFC" нужно выбросить, тогда фраза будет правильной: "Проблемы могут быть, например, при использовании."
...
Рейтинг: 0 / 0
22.03.2016, 19:29
    #39198301
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ?
Leonid KudryavtsevMasterZivЛогика безумная.
Но если хочешь на свою попу приключений -- вперёд, я уже написал.
Не знаю, в чем безумная. > 15 лет DLL на Borland C, MS C клепал под FoxPro 2.6, Access, Oracle Forms, Macromedia Director (ActiveX), Java и т.д.

Никаких проблем не замечал.

Просто интересно, как при логике "у приложения и твоей .dll должен быть один и тот же рантайм" люди умудряются DLL "внезапно" создавать даже на других компиляторах.

Как при Вашей логике, делать DLL для сторонних приложений? Например для Java старых версий. Как тут обеспечить "у приложения и твоей .dll должен быть один и тот же рантайм"?

===

Проблема могут быть. Например при использование MFC. Но, опять таки, нужно внимательно читать документацию и, по факту, проблемы исчезают. Когда встраивал MFC DLL в Oracle Forms была пара веселых недель, когда разбирался как правильно слинковать. Но когда корректно написал код и слинковал статистически - все проблемы исчезли. У корневого приложение "свое MFC", у DLL "свое MFC". Т.к. Windows и есть Windows, взаимодействовать между окнами через чистый HWND никто не запрещает.

Ну, проблема есть. Но не такая уж и смертельная.
Я эту библиотеку ( 18957103 ) в Delphi использую. Приходится иногда что-то доделывать. Например, выделенную в dll память я не могу освободить средствами Delphi (и наоборот), пришлось в dll добавить функцию для освобождения памяти и экспортировать ее для использования в Delphi.

Но ничего страшно-ужасного до сих пор не случалось.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / MS VS 2013, построение библиотеки libsodium: можно ли строить .dll - проект с ключом /MT ? / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]