Выпуск сборки проблемы; Передача объекта std :: string в функцию статической библиотеки - PullRequest
2 голосов
/ 09 июля 2011

Это первый раз, когда я пытался использовать сборку релиза с Visual C ++ 2005, и, похоже, есть определенные различия.

Моя текущая ошибка:

Unhandled exception at 0x6ef7d628 (msvcr80d.dll) in <program_name>: 
0xC0000005: Access violation reading location 0x6c2e6769.

Я заглядываю в стек вызовов, и получается, что строка, переданная в функцию статической библиотеки, которую я сделал, дает "Плохой Ptr", и я понятия не имею почему. Прекрасно работает в отладочной сборке ...

Вот такая строка:

int main()
{
    static Script luaScript("config.lua");

Script - это просто класс, который я создал, который обрабатывает файлы сценариев lua. Он статический, потому что я хочу, чтобы он был одноэлементным, чтобы любой код мог получить к нему доступ.

Конструктор Script:

Script::Script(const string &filename)
{
    luaState = lua_open();
    scriptFilename = filename; // unhandled exception occurs here; Intellisense     
                               // identifies filename as a <Bad Ptr>
                               // works perfectly fine in debug

}

Я думаю, что это может быть потому, что библиотека тоже находится в режиме отладки, но я не могу заставить ее скомпилировать, когда я пытаюсь использовать Release.

fatal error C1010: unexpected end of file while looking for precompiled header. 
Did you forget to add '#include "stdafx.h"' to your source?

Я немного знаком с этим файлом, но зачем он мне нужен для сборки Release моей статической библиотеки? Не просил об этом в Отладке.

Хорошо, иди, возьми файл stdafx.h и ... появилась новая ошибка!:

fatal error C1083: Cannot open precompiled header file: 
'Release\Script.pch': No such file or directory

Ну, довольно сложно найти центральный вопрос для всего этого, кроме: «Что в мире Visual C ++ 2005 хочет, чтобы я делал для сборок Release!?».

Я надеюсь, что кто-то может помочь. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Способ № 1 исправить Cannot open precompiled header file" - это очистить / перестроить все.
После этого я бы начал с различий между сборкой выпуска и отладки.Либо откройте файл проекта, либо сравните параметры проекта из Visual Studio.
Получите библиотеку для сборки в выпуске, прежде чем беспокоиться о проблеме Bad Ptr.Весьма вероятно, что проблема Bad Ptr исчезнет, ​​как только вы преодолеете это.
В противном случае, я вижу только одно, что вы передаете char [], а не std :: string.Я не думаю, что это действительно проблема, но я бы попробовал

string filename = "config.lua";
static Script luaScript(filename);

после попытки всего остального, что я упомянул.

0 голосов
/ 10 июля 2011

О синглетонах и порядке статических инициализаций:

Статическая инициализация Fiasco

Трагедия в том, что у вас есть 50% -50% вероятности смерти

Как это исправить?

Существует много решений этой проблемы, но очень простое и полностью переносимое решение - заменить глобальный объект Fred., x, с глобальной функцией x (), которая возвращает объект Fred по ссылке.

// File x.cpp

#include "Fred.h"

Fred& x()
{
    static Fred ans;
    return ans;
}
...