背景:公司不是软件公司,所以对程序开发的流程其实不擅长。公司原来有一套 delphi 程序,是一个内部用的桌面程序,最近拿出来迭代,既需要修 bug ,也需要加功能。
但是代码作者不想给出所有源码。所以请教一下,有没有可能做到:
我理解不单 Delphi 有这个需求?是不是其他编译型的语言也有这个需求?再次说明一下非专业软件公司,都是为了内部提高效率的软件,很多程序员的通用做法实在是不了解。谢谢! (delphi 节点好像有点冷清,姑且放在程序员节点,见谅。)
1
defunct9 2023-01-18 15:52:30 +08:00
老古董了
|
2
jstony 2023-01-18 15:54:30 +08:00
乘着你们还用得上,让作者出个价卖给你们,回头烂家里更不值钱了:)
|
3
JustinL OP 想强调一下,其实这个和 Delphi 老不老不强相关,因为本质是源码管理问题。
|
4
hsfzxjy 2023-01-18 16:09:11 +08:00 via Android
我记得 delphi 的 unit 可以编译成某种二进制的中间文件(好像是.dcu ),只发布 dcu 不公开源码,别人也可以编译,但看不到源码
时间太久远了,不确定是对的 |
6
0TSH60F7J2rVkg8t 2023-01-18 17:23:55 +08:00
作为 delphi 开发者来回答一下,不愿意释出源码的作者可以编译“release”版本的 dcu 文件,只要 dcu 文件和 dfm 文件存在,你都可以二次开发,编译都没问题。但是你只能改自己的代码,调试自己的代码,一旦要单步进入那个作者的代码,你只能看到 cpu 汇编指令,无法修改对应的源代码(因为你也没有源代码)。这是多数 vcl 第三方组件的分发方式。
综上,楼主的 3 个疑问,答案都是“肯定”的。都可以做到。 |
7
0TSH60F7J2rVkg8t 2023-01-18 17:26:08 +08:00
对了,补充一点,这种分发方式有一个限制,就是对于不同版本的 IDE (包括打补丁和不打补丁,都是不同版本的),需要编译对应的 dcu 文件,一旦你的开发环境和那位作者的不一样,由于依赖的 vcl 本身的 dcu 版本不一样,可能会出现报错无法编译的问题。
|
8
JustinL OP @ahhui 非常感谢!关于“编译 “release” 版本的 dcu 文件”,请问是他那边整个项目都编译成一个 dcu ,还是每个 unit 都编译成 dcu ,得到一堆的 dcu s ?另一方面,我这边可以怎样引入这些 dcu ?
|
9
vicalloy 2023-01-18 17:43:42 +08:00
@ahhui 已经说的比较详细了。dcu 是 delphi 的静态链接库,有完整的 dcu 和资源文件就可以正常编译。
原作者可以提供完整 dcu 和部分源代码。 感觉是公司想省钱。找原作者好好谈谈,得这点钱还是不要省的好。 |
10
vicalloy 2023-01-18 17:45:56 +08:00
我印象中 Delphi 的 dcu 不包含调试信息,不区分 release 和 debug 版。每个.pas 都会生成一个 dcu 。你把 dcu 放到项目的搜索路径下就可以找到。
|
11
terence4444 2023-01-18 17:47:18 +08:00 via iPhone
也可以考虑通过外部 dll 的方式调用?
|
12
youxiachai 2023-01-18 17:47:22 +08:00
为什么不出钱..直接买断....
|
13
0TSH60F7J2rVkg8t 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 里引用它的单元即可编译。 |
14
0TSH60F7J2rVkg8t 2023-01-18 17:49:06 +08:00
@vicalloy 包含调试信息的,而且依赖 rtl, vcl 里的 dcu 也是两套,不匹配无法在自己项目的 configuration 里编译
|
15
0TSH60F7J2rVkg8t 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 体积很有帮助)
|
16
0TSH60F7J2rVkg8t 2023-01-18 17:55:49 +08:00
|
18
eibici 2023-01-19 09:57:35 +08:00
不如痛下决心,重做一个。。。
|
20
aqtata 2023-01-19 11:29:42 +08:00
楼上都是对的,答案就是 dcu 文件,类似 c++的 obj 文件,没有源码,但是可以链接到工程中编译。
补充一点细节,dcu 文件和 delphi 版本是绑定的,比如用 xe 开发的 dcu 文件就不能在 xe2 中用了。 |