我的问题是更好地理解我在制作过程中错过的内容和.SECONDARY目的与.PRECIOUS,而不是让我的脚本工作,因为它确实有效.
我正在使用make来打开文件上的emacs编辑器(java但与此问题无关)或者如果不存在则使用模板创建它.
如果它适用于现有文件,则在使用生成的文件时,最后会将其删除.
我在.SECONDARY中添加了先决条件但没有帮助,我不得不将其添加到.PRECIOUS中.
这就是为什么不在它工作的问题.SECONDARY?.
从我在SO上找到的 .SECONDARY不能用于模式(%),但即使知道它是否是设计或是否是make中的错误.(.SECONDARY用于GNU Make和Makefile模式规则的模式规则要么忽略虚假规则,要么自发删除输出文件)
这里是我的Makefile的精简内容,以重现我的问题(请创建一个com/stackoverflow/question目录来测试它).
PACKAGE=com.stackoverflow.question
PACKAGE_DIR=$(subst .,/,$(PACKAGE))
OUT=out
clean:
find $(OUT) -name "*.class" -type f -print0|xargs -0 rm
# does not work : deleted at end due to intermediate file removal.
$(PACKAGE_DIR)/%.java:
@echo "package com.stackoverflow.question;\npublic class $(subst .java,,$(subst $(PACKAGE_DIR)/,,$@))\n{\n /** TODO */ \n}" >$@
work/%: $(PACKAGE_DIR)/$(subst work/,,%).java
emacs $<
.PHONY: clean work/%
# tried to avoid intermediate file removal : does not work
.SECONDARY: $(PACKAGE_DIR)/%.java
# …
Run Code Online (Sandbox Code Playgroud) 如何以与 SONAME 冲突的库的两个现有版本兼容的方式链接二进制文件?这两个版本不共享相同的 SONAME 前缀。一个是 libcapi10.so.3,另一个是 libcapi10.so.4。我无法重新编译它们,因为我将它们作为二进制文件,而且由于这些是经过认证的加密库,我无法使用正确的 SONAME 请求新的库。当然,如果一个是 libcap10.so.3 和另一个 libcap10.so.3.1,我不会遇到任何问题,因为我只需要链接第一个以与第二个兼容。这两个库被告知是二进制兼容的(我应该相信这个信息)。我搜索但没有找到任何好的方法,无论是使用链接器选项还是使用 objcopy。我想避免手动修补二进制文件以在编译链接时使用它。
所以回到我最初的问题:如何指定 SONAME(在本例中为 libcap10.so)用于链接?
(我已经搜索过了,我目前的发现只是它是行不通的,但不幸的是这是一个要求......)。
更新:我使用类似于 sed 的二进制工具修补了 .so 库,将 libcapi10.so.6\0 替换为 libcapi10.so\0,这是因为新名称比以前短并且 SONAME 的 elf 结构是以 C 字符串结尾的带有 0 并且在 gcc 链接期间不使用精灵校验和。我仅在编译时使用该修补库,然后我可以在目标系统上使用一个或另一个具有相同二进制文件的原始库。