什么是静态库的.lib文件,静态链接的动态库和动态链接的动态库?
为什么在动态链接的动态库中不需要.lib文件,而且在静态链接中,.lib文件只是一个包含所有方法的.obj文件.那是对的吗?
如果我有一个Windows可执行文件,我如何找出它将加载哪些dll?
我只是在讨论哪些是静态加载的,而不是像LoadLibrary那样动态加载的那些.
我知道我需要使用LoadLibrary().但是,为了使用第三方DLL文件,我需要采取哪些其他步骤?
我只是跳进了C++,这是我唯一没有得到的部分(作为Java程序员).我只是在研究如何使用Qt库和tesseract-ocr,但这个过程对我来说没有任何意义,谷歌也很难.
如何告诉编译器我正在使用的函数?是否应该有来自第三方供应商的包含文件?
请考虑以下情形:
我想编译一个与libB链接的二进制文件.我应该仅将二进制文件与libB或libA链接?
有没有办法只链接直接依赖关系,让运算符的依赖关系解析未解析的符号?
我担心库libB实现将来可能会发生变化,引入其他依赖项(例如libC,libD,libE).我会遇到问题吗?
换一种说法:
当然,b.cpp包含ah而main.cpp包含bh
编译命令:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种波纹管选项?
g++ main.cpp -o main -I. -L. -lB
Run Code Online (Sandbox Code Playgroud)
要么
g++ main.cpp -o main -I. -L. -lB -lA
Run Code Online (Sandbox Code Playgroud)
我无法使用第一个选项.链接器抱怨库libA中未解析的符号.但这听起来有点奇怪.
非常感谢.
- 更新评论:
当我链接二进制文件时,链接器将尝试解析main和libB中的所有符号.但是,libB具有来自libA的未定义符号.这就是链接器抱怨的原因.
这就是我需要与libA联系的原因.但是我发现了一种忽略共享库中未解析符号的方法.看起来我应该使用以下命令行来做到这一点:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Run Code Online (Sandbox Code Playgroud)
看起来仍然可以使用该-rpath
选项.但是我需要更好地理解它.
有没有人知道使用该-Wl,-unresolved-symbols=ignore-in-shared-libs
选项时可能存在的任何陷阱?
- 更新评论2:
-rpath
不应该用于此目的.强制在给定目录中找到库是很有用的.这种-unresolved-symbol
方法看起来好多了.
再次感谢.
我有一个MVC4 Web api项目.在运行服务项目时,我收到一个错误
无法加载文件或程序集'WebGrease,Version = 1.5.1.25624,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.该系统找不到指定的文件.
我添加了WebGrease.dll文件,但仍然出现错误
并尝试更改web.config
<bindingRedirect oldVersion="0.0.0.0-1.3.0.0"/>"
Run Code Online (Sandbox Code Playgroud)
和
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
Run Code Online (Sandbox Code Playgroud)
请告知我缺少的东西.
我需要使用C或C++中的Win32本机API获取DLL或EXE文件的产品版本和文件版本.我不是在寻找Windows版本,而是通过右键单击DLL文件,选择"属性",然后查看"详细信息"选项卡看到的版本号.这通常是由四部分组成的点缀版本号xxxx
我正在编写一个与excel文件一起使用的应用程序.我需要一个删除工作表的功能.我必须使用程序集Microsoft.Office.Interop.Excel.dll.
它在开发人员计算机上运行良好,但当我尝试在服务器上部署它时,我收到一个错误:
无法加载文件或程序集'office,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = 71e9bce111e9429c'或其中一个依赖项
我知道在计算机上未安装MS Office时会出现问题.客户不希望以任何价格在服务器上安装和购买MS Office.
我按照此处的建议在开发人员计算机上安装"Redistributable Primary Interop Assemblies":http://forums.asp.net/t/1530230.aspx/1 并再次编译我的项目.
代码示例:
public bool DeleteSheet(string tableName)
{
Excel.Application app = null;
Excel.Workbooks wbks = null;
Excel._Workbook _wbk = null;
Excel.Sheets shs = null;
bool found = false;
try
{
app = new Excel.Application();
app.Visible = false;
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
wbks = app.Workbooks;
_wbk = wbks.Add(xlsfile);
shs = _wbk.Sheets;
int nSheets = shs.Count;
for (int i = 1; i …
Run Code Online (Sandbox Code Playgroud) 我已经制作了一个NuGet包,当我从C#项目中使用它时效果很好.它在lib/net40
目录中包含一个DLL ,并且DLL被添加为引用.
现在NuGet支持C++,我如何实际修改我的包,以便可以在C++/CLI项目中将DLL添加为托管引用?我找不到任何解释这个的教程.如果我尝试按原样添加包,则会收到以下错误:
您正在尝试将此软件包安装到以"Native,Version = v0.0"为目标的项目中,但该软件包不包含任何与该框架兼容的程序集引用或内容文件.
有人会认为解决方案是将文件放在lib/native下,但根据http://docs.nuget.org/docs/reference/support-for-native-projects,这是不受支持的.此外,简单地将DLL直接放在lib下似乎没有做任何事情.
显然,我应该使用build/native下的文件.props
或.targets
文件来执行此操作,但是我需要将这些文件放入这些文件中以使其工作?
在编译和链接期间,.exp的用途是什么?.lib和.dll有什么区别?我知道将使用.lib,而在运行程序时将使用链接和.dll.但是.lib和.dll之间究竟有什么区别?
.lib文件不包含来自.dll文件的函数的代码吗?使用两个单独的文件需要什么?
请澄清.
我刚刚将另一个项目页面及其dll集成到我现有项目的Bin /文件夹中.我的项目框架是3.5.当我尝试构建项目或解决方案时,它会抛出以下错误:
"类型'ASP.global_asax'存在于'c:\ Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\timesheet\15a75c54\898b48b9\assembly\dl3\58b062b2\00ceda54_c98cc801\App_global.asax .DLL'和'c:\ Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\timesheet\15a75c54\898b48b9\App_global.asax.q_h6dbfx.dll'c:\ Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\timesheet\15a75c54\898b48b9\App_Web_admin.master.fdf7a39c.zecazgwd.0.cs"
将"batch = false"设置为web.config是行不通的.我还试图删除"c:\ Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files \"中的所有文件夹,然后清理并重建灵魂.但它仍然无法正常工作.