2010-09-21 3 views
2

Есть ли способ сделать статические библиотеки, созданные в Microsoft Visual Studio, независимо от используемого CRT (с поддержкой отладки/без него)?C++ visual studio libraries

Я имею в виду, что для простой библиотеки C можно сгенерировать код с помощью gcc, а затем использовать ту же статическую библиотеку в визуальной студии. Полученный файл library.a полностью не зависит от /MT или /MDd коммутаторов и не приводит к ошибкам предупреждения/связывания.

По сравнению с поведением по умолчанию Visual Studio вам придется создавать две версии одной и той же библиотеки - для режимов Debug/Release независимо. Если вы попытаетесь использовать версию Release в конфигурации Debug или наоборот, это приводит к уродливым предупреждениям (warning LNK4098: defaultlib "LIBCMT" ...), но иногда они не компилируются из-за разных сроков выполнения?

Есть ли способ избежать этого? Или, наверное, я что-то делаю неправильно?

+0

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

ответ

2

Чтобы сделать LIB, которая соединит в независимо от выбора времени выполнения необходимо использовать два переключатель:

/MT, чтобы построить против основного выполнения выпуска, /Zl опустить имена библиотеки по умолчанию.

Строительство против Dll автономной работы заставит компилятор украсить все символы во время выполнения с __imp_ (так, например, он будет пытаться и ссылку на __imp__fread, а не _fread). Поэтому вам нужно выбрать одно из статических режимов.

компилятор делает неявную библиотеку по умолчанию прагмы, в зависимости от выбранного Lib:

#pragma comment(lib,"libcmtd.lib") 

как это выглядит в коде./Zl заставляет компилятор опустить все эти директивы - (неявные и явные) из полученного файла .obj (и, следовательно, .lib). Таким образом, результат будет связан с чистой связью, не вызывая конфликтов библиотеки по умолчанию.

+0

Ницца, спасибо. –

1

Нет. Объектные файлы для стандартных версий релизов и отладки полностью различны. Бинарные файлы двоичных объектов являются перемещаемыми объектами-машинами, а двоичные файлы двоичных объектов являются промежуточным представлением исходного кода. То есть, бэкэнд находится в компоновщике для создания релизов, но находится в компиляторе для отладочных сборников. Помещение бэкэнда в Linker позволяет компилятору вернуться к более разумным решениям в отношении оптимизации вашей программы за счет более длительного времени компиляции.

+0

Разве это не зависит от того, было ли включено «Generation Time Time Generation», которое я видел в нескольких библиотеках, которые предоставили файлы проекта, которые были отключены? –

+0

@Fire: Конечно, это возможно, но вы не сможете установить связь с настройками по умолчанию для режима выпуска. –

1

Есть ли проблема с распространением двух версий библиотеки? Я не претендую на то, чтобы говорить для всех, но мне всегда нравится иметь отладочную версию, скомпилированную против статических debug-библиотек, с утверждениями и дополнительной проверкой, скомпилированной в. (Символы тоже хороши!) Утверждения и проверки полезны, трассировки стека обычно лучше, когда предмет падает в коде библиотеки, и часто проще читать разборку.