我开发了一个依赖于DLL文件的应用程序.当我调试我的应用程序时,应用程序会抱怨:
"此应用程序无法启动,因为找不到xxx.dll."
所以我必须将DLL文件复制到与我的.vcproj文件相同的目录中.
有没有办法设置项目在(最好)一些相对路径或(不是首选)某些绝对路径中查找DLL文件?
与我们如何在项目设置中设置包含和库路径的概念类似.
我的意思是当我调试我的应用程序(点击F5)时会弹出上面的错误.
在Visual Studio 2010中,VC++ Directories > Executable Directories我已指定了路径glew32d.dll.但是,当我运行可执行文件时,它仍然会抱怨.
另一方面,如果我将DLL复制到本地文件夹然后运行可执行文件,它不会抱怨.
有人可以告诉我如何解决这个问题吗?另外,为什么Visual Studio无法识别该路径?
更新 场景:我目前使用的模板项目用作许多项目的入门代码.此模板取决于glew32d.dll.我通常将所有相关的dll存储在一个公共bin文件夹中.我希望引用这个文件夹,Visual Studio可以从那里读取dll,而不是每次都要复制dll.处理这个问题的好方法是什么?
在Visual Studio 2003中,我尝试在预构建事件中设置一个环境变量,然后在编译步骤中使用该变量,但该值似乎不会传播.例如,如果预构建事件包含此内容(直接或在批处理文件中):
set MY_LIB_VERSION=1.0.0
Run Code Online (Sandbox Code Playgroud)
和AdditionalIncludeDirectories有这个:
c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include
Run Code Online (Sandbox Code Playgroud)
如果my_lib_v1.0.0目录存在,我希望编译工作.但相反,我得到了
c:\path\to\prog\my_prog.c(22) : fatal error C1083: Cannot open include file: 'my_lib.h' Project : warning PRJ0018 : The following environment variables were not found: $(MY_LIB_VERSION)
我推断在预构建事件中设置的环境变量因此没有传播到编译步骤,但我可能会遗漏一些东西.
如何在预构建事件中设置环境变量并在编译步骤中使用它?
(或者,任何其他明智的方法来定义一个库版本并为AdditionalIncludeDirectories和AdditionalLibraryDirectories多次使用它也会这样做.)
更新:我最终以不同的方式解决了我们的问题.我们正在使用Subversion,并svn:externals在被调用的项目源的子目录上设置该属性dependencies,这样项目的签出将另外检出<svn_path>\libraries\my_lib_v1.0.0并dependencies\my_lib在工作副本中调用它.然后项目设置可以参考dependencies\my_lib\include等.升级到版本1.0.1 my_lib只是编辑svn:externals属性的问题 - 代码和项目设置不需要更改.
windows visual-studio-2003 compilation environment-variables visual-studio
这就是我想要的:我为POSIX编写了一个巨大的遗留C/C++代码库,包括一些非常类似POSIX的东西,比如pthreads.这可以在Cygwin/GCC上编译,并在Windows下使用Cygwin DLL作为可执行文件运行.
我想要做的是将代码库本身构建到Windows DLL中,然后我可以从C#中引用它并在其周围编写一个包装器以编程方式访问它的某些部分.
我在http://www.cygwin.com/cygwin-ug-net/dll.html上使用非常简单的"hello world"示例尝试了这种方法,它似乎不起作用.
#include <stdio.h>
extern "C" __declspec(dllexport) int hello();
int hello()
{
printf ("Hello World!\n");
return 42;
}
Run Code Online (Sandbox Code Playgroud)
我相信我应该能够使用以下内容引用在C#中使用上述代码构建的DLL:
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int hello();
static void Main(string[] args)
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "helloworld.dll");
IntPtr pDll = LoadLibrary(path);
IntPtr pAddressOfFunctionToCall = GetProcAddress(pDll, "hello");
hello hello = (hello)Marshal.GetDelegateForFunctionPointer(
pAddressOfFunctionToCall,
typeof(hello));
int theResult …Run Code Online (Sandbox Code Playgroud) 一个奇怪的错误:
错误MSB8011:无法注册输出.请尝试启用每用户重定向或使用提升的权限从命令提示符注册该组件.C:\ Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets 744
尝试在ActiveX控件中使用OpenSceneGraph(OSG)时出现此错误.谷歌搜索显示各种解决方案并没有真正解决问题或找到错误的确切原因,所以我想把解决方案放在一个地方:这里.
我找到了它的解决方案,并将很快回答我自己的问题,以便人们可以找到他们遇到相同问题的解决方案.
我有一个在Visual Studio(2008)中构建的C++应用程序,并链接到Boost DLL.在调试时,似乎我需要将Boost DLL复制到调试文件夹中,以便我在IDE中运行的exe可以链接到它.我可以使用后期构建步骤来复制DLL,但我想知道Visual Studio中是否有一个设置可以在调试时为DLL提供额外的搜索路径?
我已经花了一整天的时间,这让我发疯
有人知道将 mp3 解码为简单的 16 位 pcm (wave) 文件的简单方法吗?我需要一些可以随商业程序一起提供的东西,所以我更喜欢 .lib
我找到了 libmpg123.dll,但我不知道如何让我的程序与 msvc 2010 中的 dll 链接。我知道我需要添加一个引用,但是当我单击“添加新引用”时,我得到的只是一个空对话框带有项目名称和项目目录标题,无需单击。我尝试使用 lib 工具将 .dll 转换为 .lib,但一直抱怨 .def 文件格式不好。
我试图构建 madplayer,但我无法确定 id3tag.h 并且没有关于使用 libmad 的文档或示例,我可以找到
跛脚看起来太大了
任何关于 .lib 快速解决方案的想法,我都可以链接并完成它
谢谢,史蒂夫