DLL csak azon a PC-n működik, amelyiken készült
2014-02-19T23:19:44+01:00
2014-02-27T00:57:30+01:00
2022-08-08T16:10:30+02:00
Relative
Sziasztok!

Visual Studio 2013-mal készítettem C++ nyelven egy DLL file-t, ami különböző funkciókat tartalmaz. A DLL tökéletesen működik azon a számítógépen (x64 Win7), amelyiken készült. Viszont ha bármilyen más számítógépen próbálom, ott már nem megy.

Olyasmire gyanakszom, hogy a DLL file a funkciók működésére olyan külső file-t szeretne használni, ami azon a számítógépen - talán a Visual Studio fejlesztési környezetében - megtalálható, viszont más operációs rendszeren már nincs meg.

Hogy lehet ezt kideríteni? Vagy mi lehet a probléma, hogyan tudnék utána járni? Valószínűnek tartom, hogy a DLL file készítésekor a Visual Studio Project tulajdonságainál kellene olyasmiket beállítanom, hogy a DLL-hez használandó összes file-t vagy bármilyen elemet építsen bele magába a DLL file-ba. De hol lehet ezt megtenni? Egyáltalán okozhatja ilyesmi a problémát?


Relative
Mutasd a teljes hozzászólást!
/MD, /MT, /LD (Use Run-Time Library)

/MDdDefines _DEBUG_MT, and _DLL and causes the application to use the debug multithread-specific and DLL-specific version of the run-time library. It also causes the compiler to place the library name MSVCRTD.lib into the .obj file.
Mutasd a teljes hozzászólást!

  • Találtam egy oldalt, ahol egy Dependency Walker programot ajánlanak arra, hogy kiderüljön, a DLL file-nak milyen függőségei vannak.

    Az én DLL file-omra ezt írja:

    "Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.Error: Modules with different CPU types were found.Warning: At least one delay-load dependency module was not found.Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."

    Őszintén szólva nem nagyon érte a hibaüzeneteket. Lefuttattam egy másik általam - Delphi nyelven - készített DLL file-on is az ellenőrzést, Ott is ugyanezek a hibaüzeneteket adja a Dependency Walker. Pedig az a DLL file bármilyen számítógépen működik.
    Mutasd a teljes hozzászólást!
  • Hogy lehet ezt kideríteni?

    Én úgy szoktam, hogy belenézek a .DLL-be. Így kideríthető, hogy milyen további könyvtárakra hivatkozik.

    Visual Studio Project tulajdonságainál kellene

    Most csak 2010-et tudok nézni, de a 2013-ban is hasonló helyen van: pl.
    Configuration Properties / C/C++ / Code Generation / Runtime Library / Multi Threaded (/MT)

    ui.: arra is ügyeljél, hogyha 64 bitre fordítasz, akkor azt csak 64 bitesen futtathatod...
    Mutasd a teljes hozzászólást!
  • Win32-es alkalmazás.

    2013-ban is ugyanezen a helyen van. A Runtime Library-nál ez van kiválasztva:

    Multi-threaded Debug DLL (/MDd)

    Ez mit jelent? Állítsam át Multi Threaded (/MT)-re?

    ...Kipróbáltam. Kaptam egy csomó hibaüzenetet. Olyanokat is, amik arra utalnak, hogy a korábbi Project másolásaimmal/átnevezéseimmel maradandó nyomokat hagytam a rendszerben.

    Azt hiszem, hogy készítek egy teljesen új Project-et és mindent felépítek újra a tiszta forráskódok alapján.
    Mutasd a teljes hozzászólást!
  • /MD, /MT, /LD (Use Run-Time Library)

    /MDdDefines _DEBUG_MT, and _DLL and causes the application to use the debug multithread-specific and DLL-specific version of the run-time library. It also causes the compiler to place the library name MSVCRTD.lib into the .obj file.
    Mutasd a teljes hozzászólást!
  • Köszi szépen. Nézem...
    Mutasd a teljes hozzászólást!
  • Ez a 32- és 64-bites elemek keveredését szokta jelenteni. A Dependency Walker-ben ne csak a hibaüzenetet olvasd el, hanem derítsd fel a DLL-ek függőségi rendszerét (szép hosszú lesz). Ezt azon a gépen is csináld meg, ahol működik, meg azon is, ahol nem.
    Mutasd a teljes hozzászólást!
  • Rendben, köszönöm. Ennek is utána nézek.

    Jelenleg ott tartok, hogy készítettem egy teljesen új Project-et és csak a régi program .cpp forráskódját használva újra elkészítettem a DLL-t.

    Átállítottam a Multi-threaded Debug DLL (/MDd) opciót Multi Threaded (/MT)-re. Ekkor egy olyan hibaüzenettel szembesültem, hogy a VS nem talál egy libboost_system-vc120-mt-sgd-1_55.lib nevű file-t. (Ez elvileg a Boost csomag része kellene, hogy legyen, melyet a Project-hez használok az egyik funkció internetes HTTP file beolvasására.)

    Úgyhogy most itt akadtam el, hogy nem tudom, hogy miért hiányzik a file. Aztán rákeresve a problémára, az egyik oldalon azt olvasom, hogy:

    "Boost 1.54.0 cannot be built with VS2013 without applying some patches. See also here How do I build boost with new Visual Studio 2013 preview?"

    Követve a linket - az 1.53-as Boost telepítését ajánlják. Bár nem az 1.55-ös verzió, amit én használok, hanem az 1.53-as helyett ajánlják. Mindenesetre elkezdtem telepítgetni az 1.53-at, ahol megint egy kisebb akadályba ütköztem. Ugyanis e szerint az oldal szerint próbáltam eljárni az installálásnál. De az egyik pontban azt írják, hogy át kell írni egy bizonyos user-config.jam file-t. Nekem meg olyan nincs.

    Másik szálon nézelődve a libboost_system-vc120-mt-sgd-1_55.lib file hiányának orvoslására - itt azt írják, hogy a Runtime Library-t állítsam vissza /MT-ről /MDd-re. Vagyis visszairányít oda, ahonnan indultam.

    Szóval itt tartok. Most próbálkozom mindenfélével. Elsősorban szeretnék telepíteni egy 1.53-s Boost-ot, hogy kizárjam, hogy azzal van-e gond.
    Mutasd a teljes hozzászólást!
  • Két random kérdés:
    - gondolod, hogy ezek a beállítások befolyásolni fogják a programod 32- avagy 64-bites mivoltát?
    - egészen biztos, hogy kell neked ez a boost? Tudom, hogy némelyeknek ez a vallása (másoknak meg a Qt, vagy a glib, vagy bármi más), de azt is tudnod kell, hogy ez plusz egy problémaforrás amikor a hordozhatóságról/kompatibilitásról van szó.
    Mutasd a teljes hozzászólást!
  • Futnia kell 32 és 64 bites operációs rendszereken is. Win32-es Library Project-et készítek. Remélem ezzel nem lesz gondom.

    Csak Boost-tal tudtam megoldani(cURL-es sikertelen próbálkozás) egy webszerveren lévő file tartalmának string változóba történő olvasását úgy, hogy utána a funkcióim működjenek a célszoftverrel (Metatrader program meghívásával).
    Mutasd a teljes hozzászólást!
  • Natív C++-hoz kevéssé értek, de amennyire tudom, a VS2013-ban készült C++ programok futtatásához szükség van erre (minden VS-hoz letölthető megfelelő verzió):

    Visual C++ Redistributable Packages for Visual Studio 2013

    Ez ugye telepítve van a célgépen?
    Mutasd a teljes hozzászólást!
  • Nem volt telepítve. Köszönöm, hogy felhívtad rá a figyelmemet.

    (Sajnos a telepítés után is keresi a VS a libboost_system-vc120-mt-sgd-1_55.lib file-t.)
    Mutasd a teljes hozzászólást!
  • Ez a library-hiba az előzmények szerint már azután jött, hogy elkezdted átállítgatni a projectet.

    Az eredeti kódodat is próbáltad?
    Mutasd a teljes hozzászólást!
  • Amikor legelőször átállítottam a Runtime Library-t Multi Threaded (/MT)-re, akkor kaptam több olyan hibaüzenetet, melyben olyan Project nevek szerepeltek, amiket az átnevezésekkor használtam. Ezért készítettem egy teljesen új Project-et, hogy az átnevezésekből adódó esetleges hibákat kiszűrjem.

    Végül az új Project-nél már csak ez a hiányzó libboost_system-vc120-mt-sgd-1_55.lib file-os hibaüzenetem van. Ez is csak akkor, ha a Multi Threaded (/MT) beállítást használom. Ha az alapbeállítás szerinti Multi-threaded Debug DLL (/MDd)van beállítva, akkor hibaüzenet nélkül elkészül a DLL file. Viszont ekkor csak a saját számítógépemen működik a DLL.
    Mutasd a teljes hozzászólást!
  • Kivettem a programból a Boost-os funkciókat. Így próbáltam Multi Threaded (/MT) beállítással. Most ezt a hibaüzenetet kapom:

    "error LNK2019: unresolved external symbol __CrtDbgReportW referenced in function "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z)
    error LNK1120: 1 unresolved externals"

    Ez mi lehet?

    Azon gondolkodom közben, hogy biztosan erőltessem-e ezt a Multi Threaded (/MT)-s beállítást. Nem tudom, hogy igazán, hogy mire való, és abban is csak reménykedek, hogy ezzel más gépen is működik majd a DLL.

    Még egy dolog. Próbáltam a DLL-t ugyanolyan 64 bites Windows 7-en, mint amin a DLL-t készítem. És azon sem megy. Tehát nem operációs rendszer függő a DLL file. Kizárólag az én gépemen hajlandó futni, máshol nem.
    Mutasd a teljes hozzászólást!
  • Az egyszerűtől kellene a bonyolult felé haladni, nem fordítva:

    legyegszerűbb: nincs debug, nincs multithread, nincs boost
    Mutasd a teljes hozzászólást!
  • Pontosan! Ezzel próbálkoztam. Gyakorlatilag lebutítottam teljesen a programot. De továbbra is a szokásos hibaüzeneteket kaptam.

    Aztán gondoltam egyet! Átállítottam a Runtime Library-t Multi-threaded Debug (/MTd)-re. És láss csodát! Működik :) Működik mindegyik számítógépen.

    Azért olyan nagyon még nem örülünk. Most már csak egyetlen megoldandó feladat van. Ha visszateszem a Boost-os funckiót is, akkor továbbra is hiányolja a VS a libboost_system-vc120-mt-sgd-1_55.lib file-t.

    Úgyhogy most már csak erre kell koncentrálni.
    Mutasd a teljes hozzászólást!
  • Van olyan fájlod? :)
    A boost system-et gondolom te magad build-elted.

    Na ott sem mindegy, hogy milyen opciókkal buildelsz!
    mt-sgd jelentése
    Mutasd a teljes hozzászólást!
  • Nincs olyan file a számítógépen.

    Boost System-et? Nem tudom, hogy pontosan egyre gondolunk-e. Az 1.55-ös verziót telepítettem. E szerint az útmutató szerint: Boost 1.55 installation

    Aztán utána a Project-be beállítottam az include könyvtárat a C/C++/General/Additional Include Directories-nél, valamint a lib könyvtárát a Linker/General/Additional Library Directories opciónál.

    Kutakodva az Interneten találtam ugyanakkor egy ilyet:

    "Known Bugs with Visual Studio 2013/Visual C++ 12

    Visual Studio 2013 was released quite late in the release process, so there exist several unresolved issues. These include:

    • Serialization can't compile because of a missing include.

    • Using has_member_function_callable_with from Boost.Container's allocator_traits causes a compile error (#9332).

    • In libraries such as Unordered and MultiIndex, calling overloaded functions with initializer lists can result in a compile error, with Visual C++ claiming that the overloads are ambiguous. This is a Visual C++ bug and it isn't clear if there's a good workaround. This won't affect code that doesn't use initializer lists, or uses an initializer list that doesn't require an implicit conversion (i.e. an initializer list of the container's exact value type).

    • Thread: ex_scoped_thread compile fails (#9333)."

    El kellene felejtenem a 2013-as VS-t? Lehet, hogy telepítek egy 2012-es verziót. Talán ezzel lehet a gond.
    Mutasd a teljes hozzászólást!
  • > Ha visszateszem a Boost-os funckiót is, akkor továbbra is hiányolja a VS a libboost_system-vc120-mt-sgd-1_55.lib file-t.

    "A VS" hiányolja? Ez pontosan mit jelent?
    Mutasd a teljes hozzászólást!
  • Nem azzal van a gond szerintem.

    Te egy kész, már build-elt boost töltöttél le. Buildelt -> a forrást előre lefordították neked, így előállítva a szüksgées lib-eket és .dll-eket. Igen ám, de a forrást sokféleképpen lelehet fordítani.

    debug, nem debug
    .dll/.lib dinamikus, vagy statikusan szeretnél-e linkelni
    mt/single thread

    a /MTd opcióval megmondod, hogy debug és mt-ed, valamint statikusan akarod linkelni, azaz beleépíteni a szükséges dolgokat a .dll-edbe, hogy ne kelljen a boost-os dll-t cipelni.

    Ennek megfelelően szükséged lesz a 'libboost_system-vc120-mt-sgd-1_55.lib' fájlra!!

    mt-sgd = multi-threaded, static-link, debug információval
    Teljesen összevág azzal, amit csinálsz :)
    Mutasd a teljes hozzászólást!
  • 2 megoldás:
    a.
    Olyan opciókkal állítod elő a .dll-ed, amilyennel az általad fellelhető .lib.

    b.
    Forrásból magadnak lefordítod a boost_system-et a megfelelő beállításokkal, így előállítva a szükséges .lib állományt.
    Mutasd a teljes hozzászólást!
  • Értem! De jó, hogy ti ilyen okosak vagytok és ennyire segítőkészek!

    Szóval telepítenem kell normálisan a Boost-ot...

    "A VS" hiányolja? Ez pontosan mit jelent?"

    Azt, hogy a VS fordításkor ezt a hibaüzenetet küldni:

    "Error    1    error LNK1104: cannot open file 'libboost_system-vc120-mt-sgd-1_55.lib'"
    Mutasd a teljes hozzászólást!
  • Ha nagyon elakadnál, majd küldök ehhez segítséget, step-by-step.
    Igaz GCC-hez (MinGW) van csak tapasztalatom, de elvileg csak egy helyen kell mingw helyett msvc-t írni kb és működnie kell.. :D
    Mutasd a teljes hozzászólást!
  • Bocs, akkor nyilván nem figyeltem, mert én úgy értettem, hogy a fordítás+szerkesztés elkészül, csak egy másik gépen való futtatás nem megy.
    Mutasd a teljes hozzászólást!
  • Óh, ezt nagyon szépen köszönöm. Légy szíves küldd el az útmutatót.

    Keresgéltem utána a neten. De a fejemet fogom attól, hogy milyen körülményes telepíteni. Főleg úgy, hogy gyakorlatilag fogalmam sincs, hogy milyen lehetőségek, választási opciók szükségesek.

    Küldjek egy e-mail címet?

    "Bocs, akkor nyilván nem figyeltem, mert én úgy értettem, hogy a fordítás+szerkesztés elkészül, csak egy másik gépen való futtatás nem megy."

    Volt arról is szó. Illetve eredetileg onnan indult a probléma, hogy Boost-os funkcióval látszólag tökéletes volt a DLL. De csak az én gépemen. Aztán amikor állítgattam az opciókat a VS-ben, akkor jöttek elő a hibaüzenetek.
    Mutasd a teljes hozzászólást!
  • **G**fórumtársam segítségével végül megfelelően tudtam telepíteni a Boost-ot.

    Nagyon rövide az eljárás, ami az eseteben használ, és a VS számára elérhetővé vált a keresett file:

    1. Boost kicsomagolása egy szabadon választott könyvtárba.
    2. cmd.exe promt-ból futtatni a bootsrap.bat file-t
    3. cmd ablakban futtattam a bjam.exe-t az alábbi paraméterekkel:

    bjam --build-type=complete toolset=msvc-12.0 link=static variant=debug threading=multi

    Utána csak annyi volt a teendő, hogy a MSVS Project\Configuration Properties\VC++ Directories opcióknál az Include Directorions beállításnál felvettem a Boost telepítési könytárát, a Library Directories opciónál pedig a Boost\stage\lib könyvtárat

    Aldott legyen, aki feltalálta a biteket! ;)
    Mutasd a teljes hozzászólást!
abcd