Delphi 开发中,既保护源码,又可以分模块 dubug 的方法

2023-01-18 15:48:15 +08:00
 JustinL

背景:公司不是软件公司,所以对程序开发的流程其实不擅长。公司原来有一套 delphi 程序,是一个内部用的桌面程序,最近拿出来迭代,既需要修 bug ,也需要加功能。

但是代码作者不想给出所有源码。所以请教一下,有没有可能做到:

  1. 代码作者还是拿着全套代码,但是会发出个别 form
  2. 其他人也能 debug 这个 form ?
  3. 最好能对原代码做尽可能少的改动

我理解不单 Delphi 有这个需求?是不是其他编译型的语言也有这个需求?再次说明一下非专业软件公司,都是为了内部提高效率的软件,很多程序员的通用做法实在是不了解。谢谢! (delphi 节点好像有点冷清,姑且放在程序员节点,见谅。)

1419 次点击
所在节点    程序员
20 条回复
defunct9
2023-01-18 15:52:30 +08:00
老古董了
jstony
2023-01-18 15:54:30 +08:00
乘着你们还用得上,让作者出个价卖给你们,回头烂家里更不值钱了:)
JustinL
2023-01-18 15:56:18 +08:00
想强调一下,其实这个和 Delphi 老不老不强相关,因为本质是源码管理问题。
hsfzxjy
2023-01-18 16:09:11 +08:00
我记得 delphi 的 unit 可以编译成某种二进制的中间文件(好像是.dcu ),只发布 dcu 不公开源码,别人也可以编译,但看不到源码

时间太久远了,不确定是对的
JustinL
2023-01-18 16:33:11 +08:00
@hsfzxjy 非常感谢,是一个有用的信息。
ahhui
2023-01-18 17:23:55 +08:00
作为 delphi 开发者来回答一下,不愿意释出源码的作者可以编译“release”版本的 dcu 文件,只要 dcu 文件和 dfm 文件存在,你都可以二次开发,编译都没问题。但是你只能改自己的代码,调试自己的代码,一旦要单步进入那个作者的代码,你只能看到 cpu 汇编指令,无法修改对应的源代码(因为你也没有源代码)。这是多数 vcl 第三方组件的分发方式。

综上,楼主的 3 个疑问,答案都是“肯定”的。都可以做到。
ahhui
2023-01-18 17:26:08 +08:00
对了,补充一点,这种分发方式有一个限制,就是对于不同版本的 IDE (包括打补丁和不打补丁,都是不同版本的),需要编译对应的 dcu 文件,一旦你的开发环境和那位作者的不一样,由于依赖的 vcl 本身的 dcu 版本不一样,可能会出现报错无法编译的问题。
JustinL
2023-01-18 17:38:19 +08:00
@ahhui 非常感谢!关于“编译 “release” 版本的 dcu 文件”,请问是他那边整个项目都编译成一个 dcu ,还是每个 unit 都编译成 dcu ,得到一堆的 dcu s ?另一方面,我这边可以怎样引入这些 dcu ?
vicalloy
2023-01-18 17:43:42 +08:00
@ahhui 已经说的比较详细了。dcu 是 delphi 的静态链接库,有完整的 dcu 和资源文件就可以正常编译。
原作者可以提供完整 dcu 和部分源代码。
感觉是公司想省钱。找原作者好好谈谈,得这点钱还是不要省的好。
vicalloy
2023-01-18 17:45:56 +08:00
我印象中 Delphi 的 dcu 不包含调试信息,不区分 release 和 debug 版。每个.pas 都会生成一个 dcu 。你把 dcu 放到项目的搜索路径下就可以找到。
terence4444
2023-01-18 17:47:18 +08:00
也可以考虑通过外部 dll 的方式调用?
youxiachai
2023-01-18 17:47:22 +08:00
为什么不出钱..直接买断....
ahhui
2023-01-18 17:48:16 +08:00
@JustinL 他可以编译成不同的文件给你,有的文件不想给源代码,就编译 release 的版本,想给源代码,就带 pas 给你,但如果带 pas 给你,那他得编译两套,也就是 debug 和 release 的 dcus 都要给你,不然你在 ide 的 debug 下可能无法编译部分文件。

你的项目中,点击 Project->Project Options, Delphi Compiler->Search path 里,加上它给你的所有 dcu 所在的目录即可编译。注意如果他给你了 debug 和 release 两个版本的 dcu ,那么你在 Project Options, Delphi Compiler, Target 里,要给 debug configuration 和 release configuration 设置不同的 Search path ( debug configuration 使用包含它 debug 版本的 dcus 文件的目录、release configuration 使用包含它 release 版本的 dcus 文件的目录),然后你直接在你的 pas 的 uses 里引用它的单元即可编译。
ahhui
2023-01-18 17:49:06 +08:00
@vicalloy 包含调试信息的,而且依赖 rtl, vcl 里的 dcu 也是两套,不匹配无法在自己项目的 configuration 里编译
ahhui
2023-01-18 17:51:22 +08:00
@terence4444 delphi 用 dll 挺麻烦的,接口写的不好踩的坑比 C++还麻烦。但是 delphi 用 bpl 是可以的,bpl 就是 delphi 自己的 dll 。但一样,要分 debug 和 release 版本,而且对应版本的 dcu 也必须带着,因为编译的时候还是会找这些文件。只不过 runtime 的 bpl 可以直接随软件发布,里面的 code 不会编译到最终 exe 里(减小 exe 体积很有帮助)
ahhui
2023-01-18 17:55:49 +08:00
@JustinL
@vicalloy 我好像觉得我把 debug 的 dcu 和 C++里的 linker 搞混了,哈哈哈,不确定 debug 的 dcu 是不是必须的了。但 release 的 dcu 是必须给的。不给 debug 的 dcu 应该也能编译。
JustinL
2023-01-18 21:16:52 +08:00
@ahhui
@vicalloy
目前来看行得通了,十分感谢两位!谢谢!
eibici
2023-01-19 09:57:35 +08:00
不如痛下决心,重做一个。。。
JustinL
2023-01-19 10:26:34 +08:00
@eibici 长远考虑是打算重做的,但是目前的使用需求也要优先满足……
aqtata
2023-01-19 11:29:42 +08:00
楼上都是对的,答案就是 dcu 文件,类似 c++的 obj 文件,没有源码,但是可以链接到工程中编译。
补充一点细节,dcu 文件和 delphi 版本是绑定的,比如用 xe 开发的 dcu 文件就不能在 xe2 中用了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX