crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблемы линковки приложения в статическом режиме
AD
  опции профиля:
сообщение 8.2.2010, 13:13
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Проблемы во время линковки. Никак не могу справиться. Помогите, пожалуйста.
Цитата
msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in CategoriesCharts.obj
msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in CategoriesCharts.obj
msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: char const * __thiscall std::basic_string,class std::allocator >::_Myptr(void)const " (?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ) already defined in CategoriesCharts.obj
msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: char const * __thiscall std::basic_string,class std::allocator >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) already defined in CategoriesCharts.obj
msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(class std::basic_string,class std::allocator > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) already defined in CategoriesCharts.obj
..\..\Bin\Release\LibraryBuilder\LibraryBuilder_.exe : fatal error LNK1169: one or more multiply defined symbols found

У меня включены флаги следующие: Runtime Library = Multi-threaded (/MT), Omit Default Libraries Names = Yes (/Zl)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.2.2010, 13:24
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


А что находиться в CategoriesCharts.h и CategoriesCharts.cpp?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 8.2.2010, 13:51
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 8.2.2010, 13:24) *
А что находиться в CategoriesCharts.h и CategoriesCharts.cpp?

Там есть следующий заголовок:
#include <boost/shared_ptr.hpp>


А также класс фабрики:
#include <QStringList>
#include <QMap>

/// Перечисление всех типов возможных вкладок
enum TabType { T_TOPO = 0, T_MARINE, T_TOPOLIB, T_MRCLIB, T_AMMS, T_UNI };

/// Класс фабрики, загружающей любую категорию карт
template<typename key, class base> class factory
{
public:
    typedef boost::shared_ptr<base> base_ptr;

private:
    class base_type
    {
    public:
        virtual ~base_type() {}
        virtual base_ptr create() const = 0;
    };

    typedef boost::shared_ptr<base_type> base_type_ptr;

    template<class T> class derived_type: public base_type
    {
    public:
        virtual base_ptr create() const { return base_ptr(new T); }
    };

    typedef QMap<key, base_type_ptr> factory_container;

    factory_container factories;    ///< фабрика, хранящая категории карт

public:
    template<class derived> void register_factory(const key& key_name)
    { factories[key_name] = base_type_ptr(new derived_type<derived>); }
    base_ptr create(key key_name) { if(!factories.count(key_name)) throw std::out_of_range("Key not found");
                                    return factories[key_name] -> create(); }
    bool isEmpty() const { return factories.isEmpty(); }
};

Также есть другие классы, но нигде нет basic_string

В CategoriesCharts.cpp есть инклюд, где подключен файл
<string>. Но мне непонятно, почему он вдруг не видит их.... Или еще что-то.... :(

Проблему решил.

Выставил еще два флажка и сборка получилась:
в секции C/C++, Optimization:
Whole Program Optimization = Enable link-time code generation (/GL)
в линкере, секции Optimization:
Link Time Code Generation = Use Link Time Code Generation (/ltcg)

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

Сообщение отредактировал AD - 8.2.2010, 15:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 8.2.2010, 19:15
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(AD @ 8.2.2010, 15:51) *
Один маленький нюансик. Пока что мне никак не удается избавиться от файлов-dll студии. А жаль... Пока никак не удается. Они не очень напрягают, но хотелось бы убрать как-нибудь и их.


мне один раз удалось это сделать :) копать надо в сторону статической линковки, разрешения статических линков на уровне библиотек (у 2005 студии флажок /Gz, если правильно помню) и иногда вроде надо ещё точку входа явно указывать, чтобы msvcrt не подцеплялся. про точки входа можно почитать в MSDN. правда, там очень мало написано про них и как-то невнятно, в общем, избавиться от этих библиотек можно, но очень геморройное занятие. гораздо проще просто добавить их дурацкий Redist в свой инсталлятор и не париться :)

Сообщение отредактировал Iron Bug - 8.2.2010, 19:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.2.2010, 13:47
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Да что такое. Не было, не было... А тут опять проблемы со статической линковкой. Кто подскажет, в чем дело?

Цитата
2>Linking...
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall QVariant::QVariant(void)" (__imp_??0QVariant@@QAE@XZ)
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: int __thiscall QWidget::height(void)const " (__imp_?height@QWidget@@QBEHXZ)
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: int __thiscall QWidget::width(void)const " (__imp_?width@QWidget@@QBEHXZ)
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class QRect const & __thiscall QWidget::geometry(void)const " (__imp_?geometry@QWidget@@QBEABVQRect@@XZ)
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall QWidget::setMouseTracking(bool)" (__imp_?setMouseTracking@QWidget@@QAEX_N@Z)
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall QWidget::hide(void)" (__imp_?hide@QWidget@@QAEXXZ)
2>ChartWidget.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall QSize::QSize(void)" (__imp_??0QSize@@QAE@XZ)
2>Global.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: bool __thiscall QVariant::isValid(void)const " (__imp_?isValid@QVariant@@QBE_NXZ)
2>Global.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class QString & __thiscall QString::remove(class QRegExp const &)" (__imp_?remove@QString@@QAEAAV1@ABVQRegExp@@@Z)
2>Global.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: int __thiscall QString::size(void)const " (__imp_?size@QString@@QBEHXZ)
2>InputData.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: struct QString::Data * & __thiscall QString::data_ptr(void)" (__imp_?data_ptr@QString@@QAEAAPAUData@1@XZ)
2>SearchIntersection.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) bool __cdecl operator!=(class QRect const &,class QRect const &)" (__imp_??9@YA_NABVQRect@@0@Z)
2>TabTopoView.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class QString __cdecl QFileDialog::getExistingDirectory(class QWidget *,class QString const &,class QString const &,class QFlags<enum QFileDialog::Option>)" (__imp_?getExistingDirectory@QFileDialog@@SA?AVQString@@PAVQWidget@@ABV2@1V?$QFlags@W4Option@QFileDialog@@@@@Z)
2>TabTopoView.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class QString __cdecl QFileDialog::getSaveFileName(class QWidget *,class QString const &,class QString const &,class QString const &,class QString *,class QFlags<enum QFileDialog::Option>)" (__imp_?getSaveFileName@QFileDialog@@SA?AVQString@@PAVQWidget@@ABV2@11PAV2@V?$QFlags@W4Option@QFileDialog@@@@@Z)
2>..\..\Bin\Release\LibraryBuilder\LibraryBuilder_.exe : fatal error LNK1120: 14 unresolved externals




Извините за беспокойство.

Помогло то, что к файлам, которые часто где использую в заголовочных файлах усложнил следующие конструкции:
#ifndef XMLREADER_H_055_099
#define XMLREADER_H_055_099

// all code


#endif //XMLREADER_H_055_099


А было просто XMLREADER_H.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 1:30