Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование статической библиотеки, Ошибки при компиляции 
V
    Опции темы
TheDestroyer
Дата 8.1.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите, пожалуйста, разобраться.
Необходимо сделать приложение независимым от установленных или нет  библиотек и вшить их в фаил (чтобы не класть их рядом с файлом).
В свойствах проекта меняю: Свойства конфигурации - С/С++ - Создание кода - Библиотека времени выполнения - MTd (или MT). При компиляции возникают ошибки:
Код

1>Компоновка...
1>MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _malloc уже определен в LIBCMTD.lib(dbgmalloc.obj)
1>MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _free уже определен в LIBCMTD.lib(dbgfree.obj)
1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) уже определен в LIBCMTD.lib(typinfo.obj)
1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) уже определен в LIBCMTD.lib(typinfo.obj)

При компиляции в режиме MD (или MDd) - все нормально.
Похоже на многократное переопределение, как с этим справиться?
PM MAIL   Вверх
jonie
Дата 8.1.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



А /MT(d) разве это не динамическая линковка?
Цитата

/MT  Defines _MT so that multithread-specific versions of the run-time routines are selected from the standard header (.h) files. This option also causes the compiler to place the library name LIBCMT.lib into the .obj file so that the linker will use LIBCMT.lib to resolve external symbols. Either /MT or /MD (or their debug equivalents /MTd or /MDd) is required to create multithreaded programs. 


но главное вот это:
Цитата

!!!Caution!!!   Do not mix static and dynamic versions of the run-time libraries. Having more than one copy of the run-time libraries in a process can cause problems, because static data in one copy is not shared with the other copy. The linker prevents you from linking with both static and dynamic versions within one .exe file, but you can still end up with two (or more) copies of the run-time libraries. For example, a dynamic-link library linked with the static (non-DLL) versions of the run-time libraries can cause problems when used with an .exe file that was linked with the dynamic (DLL) version of the run-time libraries. (You should also avoid mixing the debug and non-debug versions of the libraries in one process.)
у вас по проекту частично это и происходит... либо ВСЕ части линкуйте в одном стиле, либо может быть гемморой..

хинт: Есть еще настройка "ignore specific library"...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
TheDestroyer
Дата 8.1.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, похоже используются библиотеки, созданные в режиме MD. Что смог пересобрал, остаются: iconv.lib и Ws2_32.lib
Для iconv использовал libiconv, скачанный с http://gnuwin32.sourceforge.net/packages/libiconv.htm. 
Пытаюсь пересобрать его в режиме MT. Пытаюсь создать статическую библиотеку по инструкции отсюда http://msdn.microsoft.com/ru-ru/library/ms235627.aspx , но никак не могу разобраться со структурой исходников (libiconv-1.9.2-src). Статическую библиотеку собирал одажды - zlib, все довольно понятно. А тут неясно что вставлять в фаил проекта статической библиотеки.
Если же пользоваться инструкцией в файле README.woe32, приложенном в архиве:
Код

Step 1: Build and install the libiconv library and the iconv.exe program
   without internationalization. (This step is only needed the first time
   you install GNU libiconv.)

      For shared library (DLL):

         nmake -f Makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD
      or
         nmake -f Makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD check
                                                   [This runs the testsuite.]

      For static library:

         nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD
      or
         nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD check
                                                   [This runs the testsuite.]

      If you want to build both the shared and static library, you have to
      unpack the libiconv sources twice in different directories. Don't mix
      the two formats; you cannot use the iconv.h generated for the static
      library together with the shared library or vice versa.

      Install it:

         nmake -f Makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD install
      or
         nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD install

      Remove traces of this preliminary build:

         nmake -f Makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD distclean
      or
         nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD distclean


В этом случае уже на 1м шаге выдает ошибку: 
Код

C:\libiconv\libiconv-1.9.2-src>nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MT

Служебная программа обслуживания программ Microsoft (R), версия 9.00.21022.08
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

        cd libcharset
        "C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makef
ile.msvc all

Служебная программа обслуживания программ Microsoft (R), версия 9.00.21022.08
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

        copy include\libcharset.h.in include\libcharset.h
Скопировано файлов:         1.
        copy include\localcharset.h.in include\localcharset.h
Скопировано файлов:         1.
        cd lib
        "C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makef
ile.msvc all

Служебная программа обслуживания программ Microsoft (R), версия 9.00.21022.08
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

        cd ..
        cd ..
        copy libcharset\include\localcharset.h lib\localcharset.h
Скопировано файлов:         1.
        copy include\iconv.h.msvc-static include\iconv.h
Скопировано файлов:         1.
        cd lib
        "C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makef
ile.msvc all

Служебная программа обслуживания программ Microsoft (R), версия 9.00.21022.08
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

        cd ..
        cd srclib
        "C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makef
ile.msvc all

Служебная программа обслуживания программ Microsoft (R), версия 9.00.21022.08
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

        cd ..
        cd src
        "C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makef
ile.msvc all

Служебная программа обслуживания программ Microsoft (R), версия 9.00.21022.08
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

        cl -I. -I.. -I..\include -I..\srclib -I..\windows  -I..\lib -MT -W1 -D_N
DEBUG -O1  -DLOCALEDIR=\"c:\\usr\\share\\locale\" -DINSTALLPREFIX=\"c:\\usr\" -D
INSTALLDIR=\"c:\\usr\\bin\" ./iconv_no_i18n.c ../srclib/icrt.lib ../lib/iconv.li
b -Feiconv_no_i18n.exe
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 15.00.21022.08
 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

iconv_no_i18n.c
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:iconv_no_i18n.exe
iconv_no_i18n.obj
../srclib/icrt.lib
../lib/iconv.lib
iconv.lib(iconv.obj) : error LNK2019: ссылка на неразрешенный внешний символ __i
mp__locale_charset в функции _libiconv_open
iconv_no_i18n.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
NMAKE : неустранимая ошибка U1077: "C:\Program Files\Microsoft Visual Studio 9.0
\VC\BIN\cl.EXE": возвращенный код "0x2"
Stop.
NMAKE : неустранимая ошибка U1077: "C:\Program Files\Microsoft Visual Studio 9.0
\VC\BIN\nmake.exe": возвращенный код "0x2"
Stop.


iconv.lib(iconv.obj) : error LNK2019: ссылка на неразрешенный внешний символ __i
mp__locale_charset в функции _libiconv_open

чего-то не хватает.
Как правильно пересобрать iconv?
PM MAIL   Вверх
TheDestroyer
Дата 10.1.2010, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблему решил
Удалось скомпилироватьбез ошибок в режиме MT. Сделал следующее:
http://support.microsoft.com/kb/148652

Код

Solution One: Force Linker to Link Libraries in Correct Order
On the Project menu, click Settings.
In the Settings For view of the Project Settings dialog box, click to select the project configuration that is getting the link errors.
On the Link tab, click to select Input in the Category combo box.
In the Ignore libraries box, insert the library names (for example, Nafxcwd.lib;Libcmtd.lib). 

Note The linker command-line equivalent in /NOD:<library name>.
In the Object/library modules box, insert the library names. You must make sure that these are listed in order and as the first two libraries in the line (for example, Nafxcwd.lib Libcmtd.lib).
To set this option in Visual C++ .NET, read the "Setting Visual C++ Project Properties" online help topic.


т.е. в Свойства проекта - компоновщик - ввод - игнорировать указанную библиотеку добавить LIBCMTD.lib
В Свойства проекта - компоновщик - ввод - добавить модуль в сборку - LIBCMTD.lib
Это для режима Debug.

Поставил режим Release.
При компоновке выдает 382 ошибки:
Код

1>Компоновка...
1>LINK : warning LNK4075: не учитывается "/INCREMENTAL" из-за спецификации "/OPT:ICF"
1>iconv.lib(iconv.obj) : найден .netmodule MSIL или модуль, откомпилированный с параметром /GL; перезапускается компоновка с параметром /LTCG; добавьте /LTCG в командную строку компоновки для повышения производительности компоновщика
1>LINK : warning LNK4075: не учитывается "/INCREMENTAL" из-за спецификации "/LTCG"
1>libcpmt.lib(xmutex.obj) : error LNK2001: неразрешенный внешний символ ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)"
1>libcpmt.lib(locale0.obj) : error LNK2001: неразрешенный внешний символ ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)"
1>zipfile.obj : error LNK2001: неразрешенный внешний символ ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)"
...


Удалил игнорирование библиотеки, поставленное ранее и все заработало в Release режиме.
PM MAIL   Вверх
jonie
Дата 10.1.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



ну я писал про хинт - игнорирование библиотек, но это лишь затычка.
Ну если в релизе все ок, знать у вас liiconv собрана в релизе)
Почему у вас ее пересобрать не удалось фиг знает... я в свое время собирал без особых проблем...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
TheDestroyer
Дата 10.1.2010, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Libiconv последней версии 1.13.1 не поддерживает более Visual Studio, makefile отсутствует, очем и написано в readme. Удалось пересобрать под Visual Studio с помощью патча:
http://netimperia.livejournal.com/25553.html
Единственное в инете место по решению этой проблемы.
На всякий случай скопирую решение оттуда сюда:
Код

Инструкция по использованию:
1. Копируете в папку с libiconv патч
2. Запускаете patch -p1 < libiconv-1.13.1-win-vc9-v1.patch
3. Теперь запускаете Visual Studio Command Prompt (можете из SDK)
4. Переходите в папку с iconv
5. Запускаете nmake -f Makefile.msvc DLL=1 MFLAGS=/MD NO_NLS=1 DEBUG=0

Все пойдет компиляция.
Теперь что означают опции:
DLL=1   значит создавать DLL библиотеку  (если указать 0 то будет просто lib файл)
MFLAGS=/MD   Способ линковки библиотеки (могут быть /ML или /MT или /MD для релизов) Для дебаг версии то же самое только в конце маленькая буква d
NO_NLS=1   Означает что компилировать библиотеку без gettext. Если указать 0 то нужно будет положить в c:/usr/lib файл intl.lib для поддержки gettext
DEBUG=0    Тут все просто 0 это релиз    1 это дебаг версия...




Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  libiconv_1.13.1_win_vc9_v1.zip 19,99 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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