На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Непонятный Warning , и непонятная секция
    При компиляции, после не понятно чего ставли появлятся варнинги и ненужная секция в файле

    LIBCMT.lib(mathfcns.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

    LIBCMT.lib(cpu_disp.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators


    и секция .crt, как это можно убрать? в секции .crt нету ничего нужного:
    ExpandedWrap disabled
      29A04000: B0 21                          MOV AL,21
      29A04002: A0 29                          MOV AL,[00000029]
      29A04004: 74 22                          JZ 29A04028
      29A04006: A0 29                          MOV AL,[00000029]
      29A04008: 00 00                          ADD [EAX],AL
      29A0400A: 00 00                          ADD [EAX],AL


    и ADD [EAX],AL (т.е. симв. #0) идёт ещё много раз...
      Цитата MSDN
      Some code introduced static initializers or terminators, but the CRT or its equivalent (which needs to run the static initializers or terminators) isn't run when the application starts. Examples of code that would cause this:

      Global class variable with a constructor, destructor, or virtual function table.

      Global variable initialized with a non-compile-time constant.

      To fix this problem, do one of the following:

      Remove all code with static initializers.

      Do not use /NOENTRY. After you remove /NOENTRY, you may also have to add msvcrt.lib, libcmt.lib, or libcmtd.lib to your linker command line.

      Add msvcrt.lib, libcmt.lib, or libcmtd.lib to your linker command line.

      If your project is built with /ENTRY, and if /ENTRY is passed a function other than _DllMainCRTStartup, the function must call CRT_INIT.
        а что такое code with static initializers?

        Добавлено
        Ну пример что это такое,чтобы я знал что удалять/изменять?
          Написано ведь:
          Цитата
          Global class variable with a constructor, destructor, or virtual function table.

          Global variable initialized with a non-compile-time constant.


          ExpandedWrap disabled
            static int x = f();
            static SomeClassWithCtorOrDtorOrVTable obj;
            ни одного static'a в проекте нету, а всё равно этот хренов crt, чё делать?
              Цитата rmf @
              ни одного static'a в проекте нету, а всё равно этот хренов crt, чё делать?

              Ну, а то же самое, только на глобальном уровне (не в функциях)?
              ExpandedWrap disabled
                int x = f();
                SomeClassWithCtorOrDtorOrVTable obj;
                Кароче, искал я такие места в программе, не нашел ничего подозрительного, немного подумав, ввел строчку
                ExpandedWrap disabled
                  #pragma comment(linker, "/MERGE:.CRT=.text")

                и помогло! исчези и варнинги, и секция .crt, и размер файла уменьшился на пол кило!
                  Ты убрал одно из следствий (варнинг), а не причину самого варнинга.
                  Вот тебе пример:
                  ExpandedWrap disabled
                    #include <windows.h>
                    #pragma comment(linker, "/ENTRY:main")
                     
                    //#pragma comment(linker, "/MERGE:.CRT=.text")
                     
                    #pragma inline_depth(0)
                    const char* f()
                    {
                        return "abc";
                    }
                    const char* g_psz = f();
                    int main()
                    {  
                        DWORD n;
                        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), g_psz, 3, &n, 0);
                    }

                  При раскомментировании прагмы варнинг пропадает, однако программа от этого не начинает работать правильно.
                  Я не гарантирую 100%, что ты столкнешься с проблемами, однако сам я не видел .crt-секций, которые можно было бы просто игнорировать без последствий.
                    честно говоря не очень понимаю...
                    значит у меня могут быть ошибки, и программа может вылетиеть?

                    а что в этом коде не так?
                      Цитата rmf @
                      значит у меня могут быть ошибки, и программа может вылетиеть?

                      Именно это я и хотел сказать.

                      Цитата
                      а что в этом коде не так?

                      А ты скомпильни и запусти ;)
                      Раз ты тут не видишь, то возможно, что и у себя что-то мог пропустить...
                        Ок, примерно понял в чём проблема...
                        в строке char* g_psz = f();
                        т.е. если при объявлении присваивать то ничего не получается, а если в коде то все ок, а как можно исправить эту ошибку? просто в коде присваивать?
                          Цитата rmf @
                          Ок, примерно понял в чём проблема...
                          в строке char* g_psz = f();
                          т.е. если при объявлении присваивать то ничего не получается

                          Да, но не всё. Происшедшее называется динамической инициализацией (в отличие от статической, когда значение может быть посчитано на этапе компиляции/линковки и просто записано в область памяти переменной, например: char* g_psz = "abc";)
                          Грубо говоря, в данной секции и содержатся указания стартовому коду (который я отключил через /ENTRY) выполнить функцию f() и её результат присвоить переменной g_psz. Лишь после всех инициализаций стартовый код зовет main().
                          Аналогично - с вызовами конструкторов глобальных объектов.
                            Я на си перешел не давно(с delphi), нужно один проект переписать с Делфи на Си, и не очень всё понимаю.

                            Насчет динамической и статической вроде немного понял. Но опять же ничего у себя в коде не нашел :(
                            в msdn'е написанно(ну и ты выше написал, не обратил внимания сначала) что можно добавить библиотеку msvcrt.lib если используешь свою точку входа, и тоже исчезнет вся эта фигня, добавил, исчезла, и даж размер уменьшился вдвое ( 11 kb -> 5.5 kb ), но опять добавился этот msvcrt80.dll(опять пришел к тому, с чего начинал).
                            в списках вызываемых ф-ций есть memcpy, memset, strstr, strchr.

                            1 - добавление библиотеки решит проблему с возможной ошибкой у меня в коде?

                            2 - memcpy, memset, strstr, strchr занимают аж целых почти 6 килобайт?

                            3 - Есть аналоги в апи для этих ф-ций? для ф-ций типа strcpy нашел lstrcpyA и т.д., для этих чета не видел!

                            4 - и после замены этих ф-ций, размер останется таким какой стал? 5.5 кило, и исчезнет ли msvcrt80.dll


                            з.ы. совсем запутался сэтим vs c++
                              Цитата rmf @
                              1 - добавление библиотеки решит проблему с возможной ошибкой у меня в коде?

                              Нет. Её решит только отказ от /ENTRY или нахождение и удаление того, что провоцирует появление секции .crt

                              Цитата
                              2 - memcpy, memset, strstr, strchr занимают аж целых почти 6 килобайт?

                              Не только они. Там еще много всякой всячины.

                              Цитата
                              3 - Есть аналоги в апи для этих ф-ций? для ф-ций типа strcpy нашел lstrcpyA и т.д., для этих чета не видел!

                              memset - FillMemory, memcpy - CopyMemory, memmove - MoveMemory
                              strchr, strstr сам напиши или вырежи из исходников CRT

                              Цитата
                              4 - и после замены этих ф-ций, размер останется таким какой стал? 5.5 кило,

                              Не думаю.

                              Цитата
                              и исчезнет ли msvcrt80.dll

                              Наверное, только после опции компилера /NODEFAULTLIB

                              Цитата
                              з.ы. совсем запутался сэтим vs c++

                              Сам себе геморрой и ищешь.... 6к жалко. Офигеть...
                                Цитата
                                Сам себе геморрой и ищешь.... 6к жалко. Офигеть...

                                Мда... наверное ты прав, но на си я перехожу из-за маленького размера, хочется пользоватся этой возможностью по полной!

                                Цитата

                                Цитата
                                4 - и после замены этих ф-ций, размер останется таким какой стал? 5.5 кило,


                                Не думаю.

                                6 кило, кода > 500 строчек!, это мне кажется оочень хороший результат!

                                но блин, из списка вызываемых библиотек, и ф-ций исчез только strstr и strrchr!!! хотя заменил все ф-ции! в чем может быть дело? :( (memcpy и memsetостались, хотя ниоткуда не вызываются!)
                                Сообщение отредактировано: rmf -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5908 ]   [ 16 queries used ]   [ Generated: 1.07.26, 12:49 GMT ]