Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по линковке 
:(
    Опции темы
mrgloom
Дата 26.6.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



допустим в code generation я в проекте проставляю /MT т.е. статическая линковка.
и либы подключаю предназначенные для /MD(т.е. динамическая линковка) всё компилируется без ошибок
почему компилируется без ошибок?
будут ли проблемы потом?
PM MAIL   Вверх
Randajad
Дата 26.6.2012, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



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

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

Это сообщение отредактировал(а) Randajad - 26.6.2012, 12:15
PM MAIL   Вверх
baldina
Дата 26.6.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



если используется то, что одинаково в MT и MD
a) интерфейсно, то проблем с линковкой не будет
б) реализовано,  то проблем с работой не будет
однако такие эксперименты проводить таки не стоит
PM MAIL   Вверх
mrgloom
Дата 26.6.2012, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



 а если у меня есть либа собранная не мной, то как мне определить её тип?

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

Это сообщение отредактировал(а) mrgloom - 26.6.2012, 14:37
PM MAIL   Вверх
baldina
Дата 26.6.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



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

конечно

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

просить у автора/прочитать в документации/посчитать что она не использует CRT
PM MAIL   Вверх
mrgloom
Дата 27.6.2012, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



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

конечно


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


Цитата

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


а это как?
PM MAIL   Вверх
baldina
Дата 27.6.2012, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Код

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 
PM MAIL   Вверх
mrgloom
Дата 27.6.2012, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



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

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


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

Цитата

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


это я и так делаю.
PM MAIL   Вверх
mrgloom
Дата 28.6.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



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

настройки проекта, то вроде как распространяются на все библиотеки в него подключаемые?
PM MAIL   Вверх
Randajad
Дата 28.6.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



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

Это сообщение отредактировал(а) Randajad - 28.6.2012, 10:43
PM MAIL   Вверх
mrgloom
Дата 28.6.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата(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 конфликтуют.

PM MAIL   Вверх
xvr
Дата 28.6.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(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 одновременно

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.