проблема С++ линкер VS10 /NODEFAULTLIB

Тема в разделе "WASM.BEGINNERS", создана пользователем lexerff, 19 май 2011.

  1. lexerff

    lexerff New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2011
    Сообщения:
    7
    Если выставить ключ /NODEFAULTLIB , а потом в исходниках прописать #pragma comment(lib, "msvcrt"), то кидает анресолв экстернал для функций из рантайма, в частноти у меня для int* a = new int;. Подскажите в чем дело.
    Если дописать в команд лайн для линкера msvcrt.lib, то все работает хорошо.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    #pragma comment(lib, "msvcrt.lib") не? и зачем пользоваться прагмой, если можно либо не игнорировать msvcrt.lib, либо добавить ее в зависимости в настройках проекта...

    для использования оператора new необходима либа, тем более, что оператор new затем тянет за собой malloc, реализация которого (прослойка над HeapAlloc из kernel32.dll) либо статически добавляется в проект, либо добавляет динамический импорт из msvcrt.dll или msvcr**.dll... ну или можно реализовать оператор самому...

    ЗЫ вся информация в исходниках CRT в директории десятой студии...
     
  3. lexerff

    lexerff New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2011
    Сообщения:
    7
    это не помогает

    Хочется контролировать линковку всех либ самому, чтобы видеть где какая функция лежит. Да и вообще просто интересно почему игнорится директива #pragma comment(lib, "msvcrt") с ключом /NODEFAULTLIB.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    прагма непереносима... прагма может не попадать при препроцессорной обработке, если другие директивы каким-либо образом "обрубают"... к тому же некорректно заданные прагмы игнорируются... и еще раз:
    кроме того есть еще один совершенно некрасивый способ подключения библиотеки - добавить ее в свой солюшен... помню на шестой студии работало, на современных - не знаю, давно уже таким бредом не занимался)
     
  5. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    msvcrt это для динамического рантайма. А какой рантайм будет подключаться и какое имя либы будет внедряться в объектники зависит от ключей компиляции, которые ты не привел.
    Проще всего глянуть в объектник и посмотреть что за либу тебе надо подключить, скорее всего это не msvcrt.lib.
     
  6. lexerff

    lexerff New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2011
    Сообщения:
    7
    semen
    Как раз-таки именно это либу и надо, т.к. в ней реализация new.
    В ключах компиляции нет ни одной либы, выставлен /NODEFAULTLIB и в исходниках #pragma comment(lib, "msvcrt").
    На данный момент я так понимаю, что /NODEFAULTLIB перекрывает директиву #pragma comment(lib, "msvcrt"), таким образом запись #pragma comment(lib, "стандартная библиотека") вообще не имеет смысла.
     
  7. lexerff

    lexerff New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2011
    Сообщения:
    7
    Вроде бы вот он ответ с msdn'а:

    comment (C/C++)

    lib

    Places a library-search record in the object file. This comment type must be accompanied by a commentstring parameter containing the name (and possibly the path) of the library that you want the linker to search. The library name follows the default library-search records in the object file; the linker searches for this library just as if you had named it on the command line provided that the library is not specified with /nodefaultlib. You can place multiple library-search records in the same source file; each record appears in the object file in the same order in which it is encountered in the source file.

    If the order of the default library and an added library is important, compiling with the /Zl switch will prevent the default library name from being placed in the object module. A second comment pragma then can be used to insert the name of the default library after the added library. The libraries listed with these pragmas will appear in the object module in the same order they are found in the source code.
     
  8. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    lexerff
    Прочти еще раз внимательно. Я знаю что в ней есть реализация new, для динамического crt, который находится в dll ках (кроме msvcrt.lib есть еще либы для дллок msvcmrt.lib msvcprt.lib msvcurt.lib), названия дллок разное для разных студий, причем их то затаскивали в winsxs что без манифеста не подключить то вынимали.
    Так вот кроме динамической crt есть и другие версии, в ранних студиях еще 2 статические версии, с мульитредом и без, позже оставили одну мультитредную. Контролируется это ключами компиляции, для какой версии crt генерить код и ссылку на какую библиотеку (libc.lib libcmt.lib libcpmt.lib msvcrt.lib...) внедлять в .obj файлы. Приведи ключи компиляции и станет все ясно.