求助require/provide的编译问题

这两天折腾byte-compile,遇到了一个奇怪的问题。原配置文件未编译时加载正常,编译后加载提示某个required feature was not provided,不是路径的问题,emac能够找到配置文件,但似乎elc文件中没有provide,可el文件中明明有呀。什么情况下会造成编译器忽略掉provide呢,头疼!

先删除所有elc,重新编译, 确保elc都是最新的

不贴文件嗎?

你的问题不清楚,给出具体步骤,用真正的例子,空口无凭。

你打开这个 ELC 文件看看就知道了。

$ echo "(provide 'foo)" > foo.el
$ emacs --batch -f batch-byte-compile foo.el
$ cat foo.elc
;ELC
;;; Compiled
;;; in Emacs version 27.0.50
;;; with all optimizations.

;;; This file uses dynamic docstrings, first added in Emacs 19.29.

;;; This file does not contain utf-8 non-ASCII characters,
;;; and so can be loaded in Emacs versions earlier than 23.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(provide 'foo)

不知道。但相信你把问题说清楚,正着推不难搞清楚怎么一回事。

感谢各位大牛!在外面,等回去发一下。 试了好久,删除所有elc重新编译也不行。 别的配置文件都没有问题,就是关于perspective的一个配置文件。生成的elc文件中确实没有provide,我试着把provide放在文件最前面编译就没问题,纠结

Although top-level calls to require are evaluated during byte compilation, provide calls are not. Therefore, you can ensure that a file of definitions is loaded before it is byte-compiled by including a provide followed by a require for the same feature, as in the following example.

 (provide 'my-feature)  ; Ignored by byte compiler,
                        ;   evaluated by load.
 (require 'my-feature)  ; Evaluated by byte compiler.

把其他配置都删除了,就剩下 (use-package perspective) (provide 'setup_perspective)

在emacs里面使用byte-compile-file编译,生成:

~/Downloads λ cat shit.elc
;ELC
;;; Compiled
;;; in Emacs version 25.2.1
;;; with all optimizations.

;;; This file uses dynamic docstrings, first added in Emacs 19.29.

;;; This file does not contain utf-8 non-ASCII characters,
;;; and so can be loaded in Emacs versions earlier than 23.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defvar use-package--warning369 #[(keyword err) "\303\304\30\306	!$\307\310\n\311#)\207" [keyword err msg format "%s/%s: %s" perspective error-message-string display-warning use-package :error] 6])
(byte-code "\3021\303\304\305\306#?\205\307\310\311\312\304\"\313#0\207	\31\")\207" [err use-package--warning369 (debug error) require perspective nil t display-warning use-package format "Cannot load %s" :error :catch] 5)
~/Downloads λ 

我也看到这段了,但是没理解。试着先写provide,后写require,也没什么区别。

以前也遇到过类似的情况,interleave,跟pdf-tools相关的一个包,只有在pdf-tools加载的时候,安装interleave才没问题。如果pdf-tools没加载,package安装之后再启用的时候就各种undefine。感觉byte-compile依赖有点复杂,当然一直也没花时间去研究,之前配置一直是el文件直接加载,最近觉得启动有点慢,想折腾一下。

如果把perspective换成projectile,就没有问题,结尾有provide

;ELC
;;; Compiled
;;; in Emacs version 25.2.1
;;; with all optimizations.

;;; This file uses dynamic docstrings, first added in Emacs 19.29.

;;; This file does not contain utf-8 non-ASCII characters,
;;; and so can be loaded in Emacs versions earlier than 23.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defvar use-package--warning248 #[(keyword err) "\303\304\305\306	!$\307\310\n\311#)\207" [keyword err msg format "%s/%s: %s" projectile error-message-string display-warning use-package :error] 6])
(byte-code "\3021\303\304\305\306#?\205\307\310\311\312\304\"\313#0\202	\314\")\210\315\316!\207" [err use-package--warning248 (debug error) require projectile nil t display-warning use-package format "Cannot load %s" :error :catch provide setup_projectile] 5)

莫名的问题,应该是当前emacs状态有关,用别的电脑编译同样的文件就没有问题。

看不出 perspective 以及 (provide ...) 有什么特殊之处,别的 Feature 如 dired或者别的语句如 (message "hello") 就没问题么。

你的问题听起来还是很怪,不知道你有没有办法重现。

的确很奇怪,我把配置版本恢复到上一个版本,启动后编译上一版本的setup_perspective文件就没问题。 可是保持当前版本,直接编译上一个版本的文件没有provide。也就是说同一个文件,相应的包也都加载了,编译出来的结果不一样。 看来还是我自己的配置里,这次的更新有一些东西产生了影响,继续debug。