I have a problem using external DLL-s in Godot and would like to ask for advice.
I use Godot with Rust. For that, I compile a DLL which contains the game logic written in Rust (dylib.dll). So far everything is good, my application can be run.
Now I added an other external library to the stack (ValveSoftware/GameNetworkingSockets, GNS) as a DLL. This DLL is referenced only by my game logic dll (dylibd.dll), and Godot does not know about it. My game-logic-dll compiles fine referencing GNS.
Now when I start my Godot app, I get an error whic says:
ERROR: Can't open dynamic library: project/libs/dylib.dll, error: Error 126: The specified module could not be found.
.
At: platform/windows/os_windows.cpp:2395
ERROR: get_symbol: No valid library handle, can't get symbol from GDNative object
At: modules/gdnative/gdnative.cpp:501
ERROR: init_library: No nativescript_init in "res://libs/dylib.dll" found
At: modules/gdnative/nativescript/nativescript.cpp:1506
Sidenotes:
It works on linux without any issue, the problem occurs only on windows.
I use nightly-x86_64-pc-windows-msvc rust toolchain
The GameNetworkingSockets was built on the same machine, I think the vcpkg builder uses Visual Studio for the build.
all the required DLLs (my game logic DLL and the lib's DLL) is in the Working directory.
Any idea?
I have found the issue :)
The problem was really simple, the main issue here is rather the misleading and lacking error message from Windows.
The issue was that my external DLL also depends on other DLL-s as well, which windows could not find on its searching paths (in this case, libprotobuf.dll, libssl.dll, libcrypto.dll).
On my linux machines those shared libraries probably were already installed, that is why it worked there but not on Windows.
This tool also helped me al ot: https://learn.microsoft.com/en-us/sysinternals/downloads/procmon#download
With this tool it was easy to spot that my app tried to load the aforementioned DLL-s but could not find them.
I had the same problem. I developed a project with Godot on my pc (Win 10). Then I moved the same project on another pc (Win 10).
When I tried to import the project I found the "ERROR: Can't open dynamic library: C:/GodotProjects/mylib.dll, error: Error 126: The specified module could not be found."
The new pc needed some Visual C++ Redistributable packages:
Visual C++ Redistributable package
I hope this could help you
Related
Hey guys so I have combed the internet trying to find a solution to my problems I had decided I want to learn to opencv and am having a hell of a time to get a basic hello world program working.
So I'll start of with I downloaded the OpenCV2.1 from sourceforge
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/
I am currently running Visual studio 2010 on Windows 7, 32 bit.
So I installed ran the OpenCV2.1.exe file and added OpenCV to my path enviroment, I then build the libraries using cmake and ran through the following instructions
http://opencv.willowgarage.com/wiki/VisualC%2B%2B_VS2010_CMake
When i build the code in the tutorial abovei get a sucesfull build but when I try and start the program i get the "The application was unable to start correctly 0xc150002" error. Anyone have any thought ?
EDIT:
I looked at the event log and this is the information i get
Activation context generation failed for "C:\OpenCV2.1\bin\cxcore210d.dll". Dependent Assembly Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" could not be found. Please use sxstrace.exe for detailed diagnosis.
Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
C:\OpenCV2.1\bin\cxcore210d.dll
Had the same problem. Indeed I did rebuild the Dlls, but in the PATH environment variable of Windows the old DLLs C:\OpenCV2.1\bin; were before the new built DLLs C:\OpenCV2.1\build\bin\Debug; which meant that always the old were loaded ... Now it works
I have a VB6 program which tries to run a DLL written in C#.
This DLL has a COM interface so I can create an object of a class in it with "CreateObject".
The problem is that it runs and works well when I run it from the VB6 IDE, but when I make an EXE and try to run it, it throws the exception:
"Automation error. The system cannot find the file specified (-2147024894)."
Why is it happening and how can i solve it?
Look at Project, References in the IDE and look which dll or ocx file belongs to the object you are referencing with CreateObject (the Object Manager might also help to find out).
This dll file must be available when the exe is compiled, too. Usually, you need to have it registered with regsvr32.exe.
A technique I use to figure issues of this type is to open the add reference dialog in Visual Basic 6. I scroll the list of available COM Libraries and see if the problem DLL is listed. If it is then CreateObject should work, you should be able to assign it do a variant variant and use late binding to access it's members.
In addition try temporally set a reference to the variable and instead of using CreateObject use the = New and see what error messages, if any, it gives you. Generally I found them to be more informative then the ones thrown by CreateObject.
Finally it would help if you post the reason why you are choosing to use CreateObject instead of setting of a reference. If the DLL is a known object that will be continually used by the program then a reference should be set and early binding generally used.
Finally it may be that the error is resulting from a dependency of the C# COM DLL not the DLL itself. If for example I was to take a Com Library and properly register it but it relies on the COM Library Widget2000 and it NOT registered then it will throw the automation error. Especially if you are testing the EXE in it's installed environment and not the environment in which you complied it.
For example suppose I have a CAD program written in VB6 and I have source tree that begins with MyCAD. THe exe is in MyCAD/MainEXE and the shape library is in MyCAD/ShapeLibrary. I run the IDE everything is fine. Then I make my setup and goto my test machine and install it and it error on the creation of shapelibrary.
The first thing I would do it check if MainEXE will run straight out of the MainEXE directory of my source tree. That test will eliminate whether it is a install issue or a quirk of the IDE vs complied version. Then I would look at the setup and see what not being registered. Also look at either the source for the C# library or the setup for the library and see what dependencies it needs. Since it a complied COM DLL you should be able to use a dependency walker tool to see what COM references it needs. Finally make sure the correct version of the .NET framework is installed.
If you are compiling the C# DLL on your test machine - make sure you have ticked the register for COM Interop setting. If you are not compiling on the same machine you need to run RegAsm with the /codebase option.
try compiling it as an installer and include the dll/com that you use in the compilation of the installer package so that the dll/com that you use will be include in the compilation of your exe.., and install it in the windows not just copy past it.
I'm using the Boost Windows installer provided by boostpro.com and already have all the compiled binaries present in my boost_1.44/lib folder. However, when I'm trying to use the boost filesystem library, I'm getting a build error saying that
LINK : fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_44.lib'
I'm using Visual Studio 9, and I don't have a file called 'libboost_system-vc90-mt-gd-1_44.lib'. Any ideas on what I should do next?
You either need to compile the variant of Boost with "threading=multi runtime-debugging=on variant=debug" as that's not a variant that normally comes with the BoostPro installer (AFAIK); or switch your project to use a different variant. Most likely you need to turn off the "runtime-debugging=on" in VC, which translates to turning off the debug STD. See the Getting Started for what the name of the library it's asking for means.
I've written a Open Source program that I've released as GPL built using the Qt4 LGPL SDK. This program has the ability to search an optional Sqlite3 database for data.
Here is what is making me lose my mind. I compile the program on the development machine. When I try to run it, I can errors about missing DLLs. I copy those dlls into the same directory as the executable and it now works fine ( mingwm10.dll, libgcc_s_dw2-1.dll, QtCore4.dll, QtSql4.dll, QtGui4.dll ), including the database search.
Now, if I copy that folder with the executable and the DLLs to a new machine that has not had the SDK installed on it, it runs fine until I try to search. As soon as I hit the search button, I can the following error:
Title: Microsoft Visual C++ Runtime Library
Runtime Error!
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
I then download and install the SDK, doing nothing else, I can now run the program and search the sqlite3 file just fine!
What magic am I missing?
P.S. Both machines are freshly installed Windows XP systems.
You may have some libs or Qt plugins that are not deployed to the target machine. It most likely is the SQL driver plugin. Here's some info about it: http://doc.trolltech.com/latest/deployment-windows.html#qt-plugins
You'll need to copy the needed Qt plugins to a directory next to your executable. And add something like this in your main():
QApplication::addLibraryPath(QCoreApplication::applicationDirPath() + "/plugins");
(Edited link and added code)
I found the problem.
Stephen Chu was correct in that I was missing the sqlite driver. However, I can into more complications along the way.
The SDK comes with two sets of dlls. One set resides in $BASEDIR/bin and the other in $BASEDIR/qt/bin. The former contains the dlls used by Qt Creator, while the latter are the dlls that you want to ship with your executable.
I needed to take the sqlite plugin ( qsqlite4.dll ) and copy it to APP_DIR/sqlplugins. My problem was I was using the wrong qsqlite4.dll file.
A big thanks to everyone who contributed to this question.
For future reference, this issue was also discussed here: http://www.qtforum.org/article/34639/qt4-program-crashing-unless-sdk-installed.html
I have a simple .exe written in C++ (built with Visual Studio 2005) that tests some hardware using a supplied API. It works fine on the Windows 7 machine I built it on, but when I copy it to another (Windows 7) machine and run it (from the command-line) I get:
The application has failed to start
because its side-by-side configuration
is incorrect. Please see the
application event log or use the
command-line sxstrace.exe tool for
more detail.
What is "side-by-side configuration"?
I ran sxstrace.exe and read the usage info. It appears I would need to instrument my exe to generate a log file for sxstrace.exe to be useful?
I imagine the problem is my exe requires DLLs that either don't exist on the other machine, or are the wrong version. How do I find out what DLLs my exe uses, and what versions it links to on my machine (where it works)? Any other advice on copying it to another machine and getting it running? Would more information help?
mfawzymkh's answer to the "application has failed to start because the side by side configauration is incorrect" question (linked to in the question spirulence linked to in his answer to this question) appears to apply to this question also. mfawzymkh writes:
You can resolve this issue by either
one of these 1- Install VC8 Debug CRT
2- Build you app as statically linked
And mfawzymkh's comment on that same answer explains how to build as statically linked:
when you build it in VS, go to
projects->settings->C/C++->Code
Generation and choose Runtime Lib
options to be /MTd instead of /MDd
I did that and the side-by-side configuration message is gone. (And after installing something else for the DLL I was using, my EXE works.)
For what it's worth, I encountered the same issue. In the Event Viewer I had an error message that read:
Activation context generation failed for "C:\\MyExe.exe".Error in manifest or policy file "C:\\MyExe.exe.Config" on line 12. Invalid Xml syntax.
Sure enough, I'd changed a connection string and left out the closing quote. Added that back in and it solved the issue.
"when you build it in VS, go to projects->settings->C/C++->Code Generation and choose Runtime Lib options to be /MTd instead of /MDd" worked for me, although I was interested in the Release version instead of the Debug version.
Microsofto says:
/MT Causes your application to use the multithread, static version of the run-time library. Defines _MT and causes the compiler to place the library name LIBCMT.lib into the .obj file so that the linker will use LIBCMT.lib to resolve external symbols.
/MD
Causes your application to use the multithread- and DLL-specific version of the run-time library. Defines _MT and _DLL and causes the compiler to place the library name MSVCRT.lib into the .obj file.
Applications compiled with this option are statically linked to MSVCRT.lib. This library provides a layer of code that allows the linker to resolve external references. The actual working code is contained in MSVCR100.DLL, which must be available at run time to applications linked with MSVCRT.lib.
Are you suffering from the same issue as this guy? Side-by-side assemblies, Windows 7, and Visual Studio 2005