MS C/C++ Linkeroption/MT, но все еще неразрешенный _allmul() при связывании с другой IDE

Вопрос:

Я пишу файлы lib в VS, которые нужно импортировать в CVI. В последнее время возникла проблема с компоновщиком.

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

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

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

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

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

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


Редактировать:

Вот краткая демонстрация проекта, который я могу скомпилировать в VS2010, но я не могу ссылаться в CVI. Ниже приводится компиляция в виде проекта 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
}

Лучший ответ:

Это немного поздно, но, возможно, это поможет кому-то другому.

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

1) установите соответствующий пакет Microsoft SDK в свой блок разработчика. Вот один из вариантов для Microsoft SDK. (Есть другие, Google это)
2) найдите веб-сайт MSDN для неразрешенного символа, чтобы определить, что.lib/.h поддерживает его. (Например, список вариаций sprintf в MSDN)
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 platform sdk\include\crt (скопировано в проект dir и включено в проект))

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

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

[EDIT] Что касается совместимых с COFF.libs при использовании сторонних библиотек в отношении LabWindows/CVI — прочитайте сообщения здесь.

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

Что касается всех проблем, я не сталкивался с этим раньше, но этот парень сделал это.

Оцените статью
TechArks.Ru
Добавить комментарий