Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > вопрос по линковке


Автор: mrgloom 26.6.2012, 11:42
допустим в code generation я в проекте проставляю /MT т.е. статическая линковка.
и либы подключаю предназначенные для /MD(т.е. динамическая линковка) всё компилируется без ошибок
почему компилируется без ошибок?
будут ли проблемы потом?

Автор: Randajad 26.6.2012, 12:09
Возможно, линковщик исправляет это досадное недоразумение и назначает им статическую линковку.
Вывод ошибок не подавлен? Обычно, ругается, во всяком случае у меня ругалось.
Проблемы могут быть. Лучше так не делать, чтобы не получать сюрпризов в будущем. smile

И, да, компилируется - так некорректно говорить. Компилируются исходники. Можно их компилировать как угодно.
Создает дллки/экзешки - линкер. Он занимается линковкой.

Автор: baldina 26.6.2012, 12:44
если используется то, что одинаково в MT и MD
a) интерфейсно, то проблем с линковкой не будет
б) реализовано,  то проблем с работой не будет
однако такие эксперименты проводить таки не стоит

Автор: mrgloom 26.6.2012, 14:31
 а если у меня есть либа собранная не мной, то как мне определить её тип?

возможно ли подключить часть библиотек статически, а часть динамически?

Автор: baldina 26.6.2012, 17:27
Цитата(mrgloom @  26.6.2012,  14:31 Найти цитируемый пост)
возможно ли подключить часть библиотек статически, а часть динамически

конечно

Цитата(mrgloom @  26.6.2012,  14:31 Найти цитируемый пост)
а если у меня есть либа собранная не мной, то как мне определить её тип?

просить у автора/прочитать в документации/посчитать что она не использует CRT

Автор: mrgloom 27.6.2012, 08:44
Цитата(baldina @  26.6.2012,  17:27 Найти цитируемый пост)
возможно ли подключить часть библиотек статически, а часть динамически

конечно


а не подскажете как это делается в vs2008? а то я пользуюсь только параметром code generation.


Цитата

посчитать что она не использует CRT 


а это как?

Автор: baldina 27.6.2012, 10:00
Код

int mul (int a, int b) {
  return a*b;
}

поместите это в библиотеку, и линкуйте на здоровье с чем угодно: оно не зависит от стандартной библиотеки

Добавлено через 3 минуты и 10 секунд
Цитата(mrgloom @  27.6.2012,  08:44 Найти цитируемый пост)
как это делается в vs2008

в разделе Linker есть параметр Input. там вы указываете библиотеки с которыми надо линковать. часть библиотек может быть полноценными (статическими), часть - заглушками для dll.
Есть и другие способы - #pragma comment(lib, "libfilename") , установка Project Dependencies 

Автор: mrgloom 27.6.2012, 16:44
Цитата(baldina @  27.6.2012,  10:00 Найти цитируемый пост)
int mul (int a, int b) {
  return a*b;
}

поместите это в библиотеку, и линкуйте на здоровье с чем угодно: оно не зависит от стандартной библиотеки


не понял о чём вы.

Цитата

в разделе Linker есть параметр Input. там вы указываете библиотеки с которыми надо линковать. часть библиотек может быть полноценными (статическими), часть - заглушками для dll.
Есть и другие способы - #pragma comment(lib, "libfilename") , установка Project Dependencies  


это я и так делаю.

Автор: mrgloom 28.6.2012, 10:10
опять не понятен момент с линковкой, допустим я opencv собрал статически и подключил, и хочу подключить ещё python  динамически,это реально?

настройки проекта, то вроде как распространяются на все библиотеки в него подключаемые?

Автор: Randajad 28.6.2012, 10:41
Не путайте вещи. Статически - это статическая библиотека, в итоге она интегрируется в ваше приложение. Динамически - это DLL, она будет отдельно от вашего приложения.
Вы же говорите про то, как линковать CRT. CRT - это библиотека, которая нужна всегда. Проблемы возникают только тогда, когда вы решаете собрать свое приложение с /MT и статическую библиотеку, которую использует ваше приложение, с /MD.

Автор: mrgloom 28.6.2012, 11:39
Цитата(Randajad @  28.6.2012,  10:41 Найти цитируемый пост)
Вы же говорите про то, как линковать CRT. CRT - это библиотека, которая нужна всегда. Проблемы возникают только тогда, когда вы решаете собрать свое приложение с /MT и статическую библиотеку, которую использует ваше приложение, с /MD.


что то я совсем запутался
т.е. как линковать CRT это параллельно тому какие я должен подключать библиотеки?(собранные статически или динамически)
LIBCPMT.LIB
Multithreaded, static link
MSVCPRT.LIB
Multithreaded, dynamic link (import library for MSVCP80.dll)
/MD
т.е. их как бы нельзя смешивать они взаимоисключаемые?
+ непонятно откуда потом программа берёт MSVCP80.dll, она стандартная входит в винду?

У меня есть главная программа .exe собирается с boost,opencv,fftw статически и есть модуль расширение .dll куда opencv подключается статически и подключается питон динамически.

но если так пробовать собирать, то выдаются ошибки типа
Цитата

>msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in opencv_core230.lib(array.obj)

Цитата

1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrt.lib(cinitexe.obj)

т.е. я так понимаю LIBCPMT.LIB и MSVCPRT.LIB конфликтуют.

Автор: xvr 28.6.2012, 12:27
Цитата(mrgloom @  28.6.2012,  11:39 Найти цитируемый пост)
У меня есть главная программа .exe собирается с boost,opencv,fftw статически и есть модуль расширение .dll куда opencv подключается статически и подключается питон динамически.

Будут проблемы, но не с питоном, а с opencv - она у вас попадет в вашу программу дважды (один раз в составе exe, а второй раз - в составе модуля расширения dll)

Цитата(mrgloom @  28.6.2012,  11:39 Найти цитируемый пост)
но если так пробовать собирать, то выдаются ошибки типа

Угу

Цитата(mrgloom @  28.6.2012,  11:39 Найти цитируемый пост)
т.е. я так понимаю LIBCPMT.LIB и MSVCPRT.LIB конфликтуют.

В первой ошибке - передрались сборки opencv. Вторая - вообще непонятно что, похоже вы сказали линковать с LIBCPMT.LIB и MSVCPRT.LIB одновременно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)