2010-08-12 11 views
6

Mam duży kod, skompilowany z/MT (tj. Oczekujący statycznego połączenia z CRT). Muszę połączyć to ze statyczną biblioteką strony trzeciej, która została zbudowana z/MD (tj. Oczekująca dynamicznego łączenia CRT).kod mieszania skompilowany z/MT i/MD

Czy teoretycznie możliwe jest połączenie tych dwóch plików w jeden plik wykonywalny bez rekompilacji?

Jeśli połączę z/nodefaultlib: msvcrt, otrzymam niewielką liczbę niezdefiniowanych odniesień do rzeczy takich jak __imp__wgetenv. Mam ochotę wypróbować te funkcje w moim własnym kodzie, przesyłając je pod numer wgetenv itp. Czy warto to wypróbować, czy też przejdę prosto do następnego problemu?

Niestety mam Zakazane od podejmowania łatwą możliwość pakowania kod thirdparty do osobnego pliku DLL: -/

Odpowiedz

3

Nr/MT i/MD wykluczają się wzajemnie.

Wszystkie moduły przekazywane do danego wywołania łącznika musi być skompilowany z tego samego czasu wykonywania opcji kompilatora Library (/MD, /MT, /LD).

Source

+0

Nie odpowiedź, na którą liczyłem, ale dzięki ;-) – slowdog

0

Znalazłem takie rozwiązanie w źródłach OpenSSL: Wszystkie pliki OBJ biblioteki są kompilowane z kombinacji: /MT/Zl. Jak pisał autor, taka kombinacja pozwala na zbudowanie biblioteki statycznej z możliwością kompilacji z aplikacjami dynamicznymi CRT (/MD) lub statycznymi CRT (/MT).

0

Zmierzyłem się z podobną sytuacją, w której miałem dwie biblioteki, z których jedna została zbudowana z MT, a druga z MD. Musiałem zbudować plik wykonywalny, który wykorzystuje funkcjonalności obu bibliotek. Biblioteka zbudowana jako MD była trzecią stroną, więc nie mogłem jej odbudować, a biblioteka została zbudowana, ponieważ MT ma wiele zależności i zbudował je wszystkie, ponieważ MD to duży problem. Otrzymałem błąd z pliku nagłówkowego konfiguracji strony trzeciej, który spowodował, że tworzenie pliku wykonywalnego jako MD było obowiązkowe. Szukałem łatwego sposobu pakowania trzeciej biblioteki dll jako oddzielnej biblioteki DLL, o której mowa w pytaniu. Jednak w ten prosty sposób nie mogłem znaleźć wystarczającej ilości wyjaśnień w Internecie. Stąd moje dwa centy poniżej. Oto sposób obejścia go

  1. Zbudowałem inny. Dll, który działał jako interfejs. Ten interfejs w zasadzie owinął wszystkie wywołania api, które zostały wykonane do dll trzeciej strony. Plik nagłówkowy tego interfejsu nie zawierał żadnego pliku nagłówkowego z pliku dll trzeciej strony, ale wszystkie pliki nagłówkowe zostały zawarte w pliku interface.cpp. Interfejs zgodnie z oczekiwaniami został zbudowany jako MD.
  2. Teraz W moim pliku main.cpp zawarłem ten plik nagłówkowy interfejsu, aby wykonać wszystkie wywołania do dll firm trzecich za pośrednictwem interfejsu.

  3. Należy zachować ostrożność podczas przekazywania argumentów do interfejsu. Podstawowe zmienne, takie jak int, bool itp. Mogą być przekazywane jako wartość. Jednak każda klasa lub struktura musi zostać przekazana jako odniesienie do stałej, aby uniknąć uszkodzenia sterty. Dotyczy to nawet łańcucha.

Z przyjemnością przedstawiamy więcej szczegółów, jeśli nie jest to jasne!

Powiązane problemy