我正在使用Embarcadero RAD Studio 2010(C++).项目文件(.cbproj)有五个不同的标记,包含.bpis或.libs列表.我想了解一些关于链接器如何使用这些库文件列表的信息(使用或不使用运行时包构建时).
LinkPackageImports
LinkPackageStatics
AllPackageLibs
PackageLibs
PackageImports
我想我已经理解了最后一个.它包含可以从IDE中的"项目属性"设置的运行时包列表.
这个问题的动机是我试图从我的应用程序中消除不必要的依赖项..cbproj中的这五个标签似乎都包含各种不同的lib和bpis.我知道我不需要的一些库,以及我认为我不需要的一些库.从某些列表中删除某些库似乎没有任何效果,而从其他列表中删除其他库会导致表单的链接器错误[ILINK32 Error] Fatal: Unable to open file 'FILENAME.OBJ'
我正在慢慢解决所有链接器问题,但是当我在这五个列表中的一个中包含库名称时,确切地知道我告诉链接器要做什么将非常有帮助.
我想知道是否有人知道一种优雅的方法来确定给定(编译)的DLL,EXE或BPL所需的BPL.
我不确定这是否可能只是简单地扫描二进制文件引用.bpl文件名(这可能容易出现误报).
理想情况下,我想返回一个TStringList甚至以逗号分隔的内容,String其中包含所有必需的.bpl文件的名称.
我添加了我认为必要的SQLite(和sqlite-net)包到我的应用程序.但是,在运行它时,我得到一个例外:
System.DllNotFoundException未被用户代码处理HResult = -2146233052消息=无法加载DLL的'sqlite3':找不到指定的模块.(例外
我安装了以下SQLite包:

缺什么?
我尝试了ajawad987的建议,但仍然得到相同的运行时错误,即使我有这个:

...还有这个:

发生这个运行时异常的地方(在SQLite.cs中)对我来说似乎很奇怪:
var r = SQLite3.Open (databasePath, out handle, (int)openFlags, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
// open using the byte[]
// in the case where the path may include Unicode
// force open to using UTF-8 using sqlite3_open_v2
var databasePathAsBytes = GetNullTerminatedUtf8 (DatabasePath);
var r = SQLite3.Open (databasePathAsBytes, out handle, (int) openFlags, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
但是我正在使用C#,那么为什么线路甚至无法运行呢?(它在"else"块中失败了)?
是否可以(不使用运行时包或共享内存DLL)在主机应用程序和DLL模块之间传递Record类型,其中Record类型包含函数/过程(Delphi 2006及更高版本)?
让我们假设为了简单起见我们的Record类型不包含任何String字段(因为这当然需要Sharemem DLL),这里是一个例子:
TMyRecord = record
Field1: Integer;
Field2: Double;
function DoSomething(AValue1: Integer; AValue2: Double): Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
因此,简单地说明一下:我可以在主机应用程序和DLL(在任一方向)之间传递TMyRecord的"实例",而无需使用运行时包或共享内存DLL,并从主机EXE执行DoSomething功能和DLL?
为了帮助我们模块化单片应用程序,我们正在设置用于调试版本的包,同时仍然编译为发布版本的单个exe.
我们的一个包(EAUtils)包含一个正在生产的单元[DCC Error] E2201 Need imported data reference ($G) to access 'SMsgDlgWarning' from unit 'SystemUtils'.
在构建EAUtils包本身时会发生这种情况.我还没有构建依赖于EAUtils的包.EAUtils仅依赖于rtl/vcl包和我为Jedi WinApi单元创建的包.
这是行的结果:
// This is a TaskDialog override, with the same args as the old MessageDlg.
function TaskDialog(const aContent: string; const Icon: HICON = 0;
const Buttons: TTaskDialogCommonButtonFlags = TDCBF_OK_BUTTON): Integer;
const
Captions: array[TMsgDlgType] of Pointer = (@SMsgDlgWarning, @SMsgDlgError, @SMsgDlgInformation, @SMsgDlgConfirm, nil);
var
aMsgDlgType: TMsgDlgType;
aTitle: string;
begin
aMsgDlgType := TaskDialogIconToMsgDlgType(Icon);
if aMsgDlgType <> mtCustom then
aTitle := LoadResString(Captions[aMsgDlgType])
else
aTitle := …Run Code Online (Sandbox Code Playgroud) 我正在为我的应用程序创建一个"版本信息"对话框; 类似于Delphi在"关于"对话框中的内容.我想只显示运行时包(.BPL文件)的版本信息,而不是所有加载的DLL.RTLinclude函数是否可以获取已加载包的列表,或者我必须使用该EnumProcessModules函数并过滤结果?
提前致谢...
我们可以使用运行时包(*.bpl)构建VCL Win32应用程序.这些包可以动态或静态加载和卸载.
我们是否在Delphi XE2中使用新的FireMonkey框架具有类似的开发选项?
旧的Delphi 7,取消选中运行时包并构建所有技巧似乎不再起作用,所以我无法恢复任何适合我的Delphi项目的运行时BPL.
我有一个问题,我可能会在这里提出另一个问题和链接,我认为可以通过包含一个特定的BPL来解决VCL.CheckLst.pas.
我不只是知道这个问题的答案的原因是,当我开始一个新的VCL形成的项目,没有VCL BPLs在默认情况下,运行时包,有RTL和一些firemonkey东西和良好的老MadExcept和印地,但没有VCL那是什么处理?我的Delphi配置错误了吗?
当我构建一个项目,其中"链接与运行时包"设置为true时,输出exe非常小,在我的电脑上,exe工作正常,但有些人得到rtl190.bpl丢失的错误.我怎样才能解决这个问题?我还想要一个小的输出文件.
delphi ×7
delphi-xe2 ×4
bpl ×1
c++builder ×1
dll ×1
firemonkey ×1
linker ×1
nugetgallery ×1
packages ×1
record ×1
sqlite ×1
vcl ×1
wpf ×1