Visual studio - предотвратить связывание статической библиотеки - PullRequest
3 голосов
/ 12 октября 2011

Я создаю статическую библиотеку в Visual Studio 2010. Эта библиотека будет статически связана с другим моим приложением для создания .exe. Дело в том, что я хочу, чтобы мой .exe был статически связан с библиотекой C adn C ++ (не хочу зависимости от msvcp100.dll и msvcr100.dll). Но что бы я ни делал, я не могу заставить его работать.

Если я связываю свою статическую библиотеку со статическими библиотеками C и C ++, я не могу скомпилировать .exe - компоновщик жалуется на «уже определенные символы».

Если я свяжу свою статическую библиотеку с C и C ++ DLL, мой .exe будет зависеть от msvcp100.dll и msvcr100.dll.

Как сказать VS связывать мою статическую библиотеку со статическими библиотеками C и C ++ только тогда, когда она связана в моем .exe?

EDIT

Вот ошибки компоновщика fre, когда статическая библиотека lib и .exe пользователь / MT (т.е. статическая компоновка библиотеки времени выполнения):

1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in re2_release.lib(regexp.obj)
1>msvcprt.lib(MSVCP100.dll) : error LNK2005: "protected: virtual class std::basic_streambuf<char,struct std::char_traits<char> > * __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::setbuf(char *,__int64)" (?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEPAV12@PAD_J@Z) already defined in re2_release.lib(regexp.obj)
1>msvcrt.lib(MSVCR100.dll) : error LNK2005: _strtoul already defined in LIBCMT.lib(strtol.obj)
1>LIBCMT.lib(crt0init.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

Если я установлю / NODEFAULTLIB: LIBCMT, то ошибки из mscvrt.lib исчезнут, но ошибки msvcprt.lib останутся.

1 Ответ

3 голосов
/ 07 марта 2013

У меня была эта проблема, и решение libriks ее решило.Я приведу его здесь для тех, кто пропускает чтение комментариев:

Некоторые модули не используют статическое связывание библиотеки времени выполнения, потому что ваши ошибки компоновщика> показывают «msvcrt.lib», который является библиотекой импортадля версии DLL.Посмотрите более внимательно> через настройки вашего проекта и любые другие библиотеки, на которые вы ссылаетесь, убедившись, что ВСЕ> используют /MT.

...