2013-07-05 4 views
0

Я пишу файлы lib в VS, которые необходимо импортировать в CVI. В последнее время возникла проблема с компоновщиком.MS C/C++ Linkeroption/MT, но все еще неразрешенный _allmul() при соединении с разными IDE

В нем говорится, что _allmul() является неопределенным символом.

_allmul() и freinds реализованы как вызовы функций библиотеки CRT для обработки различных 64-битных операций.

Файл lib, который я пишу, является статическим, потому что я хочу, чтобы весь код жил внутри него. Ссылка на VS не является проблемой, и все unittests проходят.

Ссылка на CVI-IDE оставляет CVI Linkter, жалующегося на неразрешенный _allmul().

Я уверен, что установка переключателя/MT в VS достаточна для того, чтобы сделать ссылку на CRT статически, это кажется неправильным.

Почему мое предположение неверно? Как я могу связать звонки CRT статически?


Edit:

Вот краткий демо-проекта, который я могу компилировать в VS2010, но что я не могу связать в ХВН скомпилирован как проект LIB следующее:

HEADER

void print(unsigned A, unsigned B); 

КОД

#include "MyprintInterface.h" 

#include <stdio.h> 

void print(unsigned A, unsigned B){ 
    long long copyA = (long long) A; 
    long long copyB = (long long) B; 
    printf_s(" %lli * %lli = %lli ", copyA, copyB, copyA * copyB); 
    // copyA * copyB -> this invokes allmul 
    // printf_s this is a ms specific function 
} 
+0

Используйте форумы поддержки поставщика, чтобы найти справку. –

+0

Там нет действительно много материала о CRT, поэтому я надеюсь получить общее решение здесь. Я уже решил конкретную проблему просто путем реализации моей собственной 64-битной функции умножения - я не очень заинтересован в CVI, но внутренние механизмы компоновки CRT меня очень интересуют. – Johannes

+0

Теперь я испытываю похожие проблемы с символом _snprintf_s. Я предполагаю, что две проблемы имеют общий источник. – Johannes

ответ

1

Johannes,
Это немного поздно, но, возможно, это поможет кому-то еще.
У меня был очень похожий опыт при использовании инструментария gSoap с LabWindows/CVI. Инструментарий генерирует привязки ANSI C, используемые при создании клиентов или серверов веб-служб. Однако он иногда генерировал версии функций MS (некоторые устаревшие), которые были прототипированы немного иначе, чем в CVI. Решение этого было довольно утомительным, но в целом выполнялось следующие шаги:

1) установите Microsofts SDK в свой блок разработчика.
2) найдите веб-сайт MSDN для неразрешенного символа, чтобы определить, что .lib/.h поддерживает его.
3) включают любые необходимые файлы .lib/.h.
4) убедитесь, что файлы msvcr80.dll или msvcr100.dll видны вашим исполняемым файлам. (Т. Е либо в директории проекта, или в системном каталоге)

В дополнение к этому я должен был принести некоторые из #defines из заголовочных файлов Поддерживаемый файл записи/чтения, функции, просто , например:

#define _O_TEXT   0x4000 /* file mode is text (translated) */  
#define _O_BINARY  0x8000 /* file mode is binary (untranslated) */ 

а: (Требуется установить Microsoft Platform SDK C: \ Program Files \ Microsoft платформы SDK \ Include \ элт (копируется в папку проекта и включены в проект))

fcntl.h (definition for file mode etc., _O_BINARY) 
    float.h (definition for isnan etc.) 
    io.h  (definition for setmode etc.) 

Кроме того, есть пример CVI проект с исходным кодом, иллюстрирующий то, что я описал выше, (включая использование crt) here.

[EDIT] Что касается совместимых с COFF .libs при использовании сторонних библиотек в отношении LabWindows/CVI - Read the posts here.

[EDIT 2] После установки SDK Windows заголовки для всего, что находится в msvcrxxx.dll, будут находиться в вашей системе. Но для нахождения .h-зависимостей конкретного вызова API я обычно испытываю удачу просто искать его в Google: например, для sprintf_s et. al., первая ссылка была возвращена this. Он содержит примечания о том, как использовать sprintf_s, включая исходный код.

Что касается вопросов allmul, я не сталкивался с этим раньше, но this guy did.

+0

Я попробую это решение в ближайшее время, чтобы узнать, удалил ли он мои ошибки. У меня все еще есть демонстрационный проект, в котором я могу проверить свою работу. – Johannes

+0

Хорошо, удачи. Я буду следить за этим, если у вас есть более конкретные вопросы. кстати, если вы не знакомы с созданием CVI-совместимых .libs, я редактирую свой пост, чтобы включить ссылку о том, как, но, в общем, в редакторе, щелкните в файле заголовка, в котором вам нужен .lib, нажмите «Параметры» -> Создать библиотеку импорта DLL ... Следуйте инструкциям по умолчанию. – ryyker

+0

моей самой большой проблемой является получение файла заголовка. Если я использую ходу зависимостей для просмотра внутри msvcr100.dll, я могу видеть функции, которые мне нужны, например sprintf_s. Но как я могу получить заголовок, не написав его сам? Другое дело было бы allmul, это даже не «настоящие» функции. – Johannes

 Смежные вопросы

  • Нет связанных вопросов^_^