У меня есть приложение WPF, которое я компилирую в Visual Studio 2010, которое использует CLR .dll для взаимодействия с некоторым неуправляемым кодом C / C ++. Идея состоит в том, что WPF ссылается на CLR .dll, которая, в свою очередь, ссылается на неуправляемый код. К сожалению, я сталкиваюсь с ужасными проблемами компоновки, потому что неуправляемый код C / C ++ и связанные библиотеки все статически связываются со средой выполнения C / C ++, но если я пытаюсь использовать этот метод генерации кода в CLR .dll, он выдает ошибку потому что опция / clr и статическое связывание с CRT несовместимы. Мне нужно как-то склеить эти вещи.
Я думал, чтобы попытаться создать дополнительный .DLL, которая просто содержит весь неуправляемый код в одном пакете (также статически связанный с CRT), затем ссылка тот в CLR .dll, которая, в свою очередь, ссылается на приложение (блех!). Я пытался создать такой .dll, но проблема в том, что (может быть, очевидно?) Он не извлекал ни одного символа из статических файлов .lib, потому что он не нуждался ни в одном из них. Я пытался форсировать ссылки на символы (/ OPT: NOREF), но это не помогло. Это просто пустой .dll, который «связывает» с библиотеками, но на самом деле ничего не делает. Так что большой провал в этой идее.
Я все неправильно понимаю?
У меня нет исходного кода для некоторых неуправляемых библиотек, поэтому я не могу перекомпилировать их для динамической связи с CRT. Эти проблемы связывания становятся действительно расстраивающими!
Спасибо за любые предложения!
ОБНОВИТЬ: Я думаю, это равносильно попытке смешать /MT
а также /MD
модули вместе, которые, согласно этому, это невозможно. Как получается, что вы должны связывать проекты, в которых у вас нет контроля над сторонними библиотеками? Вы просто надеетесь, что все они выбрали один и тот же метод компоновки библиотеки времени выполнения ?! Похоже, ужасная идея …
Решение состоит в том, что вы не должны пытаться связать /MT
а также /MD
-компилированные библиотеки вместе. Я немного удивлен этим, потому что есть случаи, когда вы можете не иметь контроля над библиотеками, на которые вы должны ссылаться. И если вы пытаетесь подключиться к проекту CLR, вам лучше надеяться, что эти библиотеки были скомпилированы с /MD
или у тебя проблемы! В моем случае я смог решить эту проблему путем перекомпиляции некоторых внешних библиотек с использованием / MD. Был один, в частности, я не имел доступа к коду, и его DEFAULTLIB
был статически связанный C-runtime (libcmt.lib
), но каким-то образом я смог ссылаться на него без проблем.
Других решений пока нет …