erlang的undefined macro 'MODULE',头一行编译通不过的问题

前言:对于erlang的编译有很多方式,rebar,makefile文件 还是对于单个文件的erlc编译等,但不管何种方式,一个模块的第一行就编译不过去,实在让人纠结...

1)问题上述:

在技术交流群里,有人提到头一行编译不过去,

%%%-------------------------------------------------------------------
%%% @author someone
%%% @copyright (C) 2014, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 17. 二月 2014 下午3:30
%%%-------------------------------------------------------------------
-module(dd_config).
问题是:"编译一个.erl文件时 提示undefined macro ‘MODULE‘ 是文件第一个行 有点莫名其妙的。。"

头一行,除了注释就是 -module(XXX). 这个了.

我当时分析了这个问题:有可能是-的不是英文而是中文的-,或者前面的空格有乱码导致的,因为已经提示是第一行:

undefined macro ‘MODULE‘的error导致的.

2)问题原因:

其实:这个是编辑器bom头的问题."BOM头的问题,保存的时候选择无bom头utf8格式"。可以在对应的编辑器中设置去掉bom头.

查询下何为bom头:

什么是bom头?  在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑utf-8编码后执行就会出错的原因了。

关于BOM头信息

  类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。

  PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

  window编辑器如果保存为utf8文件就会帮你加上BOM头,以告诉其他编辑器以utf8来显示字符

但是在网页上并不需要添加BOM头识别,因为网页上可以使用 head头 指定charset=utf8告诉浏览器用utf8来解释.但是你用window自动的编辑器,编辑,然后有显示在网页上这样就会显示出0xEF 0xBB 0xBF这3个字符。

这样网页上就需要去除0xEF 0xBB 0xBF,可以使用editplus 选择不带BOM的编码,这样就可以去除了

处理方案:a)编辑器设置:

对应的编辑器下面,设置去掉bom头的设置,保存的时候选择无bom头utf8格式,对于使用的某种编辑器,如何设置不在这里做一一论述。
b) 代码检查:我发现还可以用代码进行检查,举个例子,如下:

%%%-------------------------------------------------------------------
%%% @author abcdefg
%%% @copyright (C) 2014, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : YYYY-MM-DD
%%%-------------------------------------------------------------------
-module(dd_config).

-compile(export_all).

aa() ->
inets:start(),
{ok, {{Version, 200, ReasonPhrase}, Headers, Body}} = 
httpc:request("http://www.weather.com.cn/weather/101020100.shtml").

对于上面模块,检查它是否有bom头,可以先读模块,再检查的思路处理.

在shell下的处理如下:

  

查看unicode模块,有个函数可检查bom头,API如下:

  先读模块,再检查bom头, If no BOM is found, the function returns {latin1,0},说明是没有bom头的,是没问题的。

c)脚本检查 :

实现编译脚本,这样有没有bom都可以编译了。

erlang的undefined macro 'MODULE',头一行编译通不过的问题,布布扣,bubuko.com

erlang的undefined macro 'MODULE',头一行编译通不过的问题

时间: 2024-07-29 09:51:20

erlang的undefined macro 'MODULE',头一行编译通不过的问题的相关文章

[Erl_Question06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(FileName). 每次都为一个小功能设置FileDir,好烦! 解决方法: 方法1 .  在erlang工作目录[在erl shell中运行pwd()显示的目录]建立一个.erlang文件,输入: io:format("changing work path~n"). cd("你

configure.ac:32: error: possibly undefined macro: AC_DEFINE

在ubuntu 下编译snappy时,在检查依赖关系时,处理autoconf的包时,在相关依赖包都已经安装的情况下,报如下错误,死活不过. 几经辗转,在stackoverflow上找到解决方案: justinclift commented on 15 Mar 2013 As possibly useful info if anyone else hits the "possibly undefined macro: AC_DEFINE" error. That AC_DEFINE er

解决 configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL

安装时出现configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. autoreconf: /usr/bin/autoconf failed with exit status: 1 出现之后那叫一个郁闷啊,在网上搜索,最终

C预编译, 预处理, C/C++头文件, 编译控制,

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数. (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输

添加第三方类库造成的Undefined symbols for architecture i386:编译错误

目录(?)[-] 还有另外一个httpstackoverflowcomquestions6610709undefined-symbols-for-architecture-i386 Undefined symbols for architecture i386 _OBJC_CLASS__SKPSMTPMessage referenced from error 1.原因: 如果是源码编译的话,一般就只某些头文件没有添加到src编译里面.但是对于添加库编译,一般是库的编译路径设置不正确(比如arm的

在Eclipse中设置进行JNI的头文件编译方法(转 http://blog.csdn.net/mirkerson/article/details/17187109)

这两天在搞NDK开发,JNI的头文件进行编译的时候,要跑到对应的class文件路径下(通常是工程的bin目录),进行编译生成,很是不便,也容易出错,所以考虑在Eclipse中作为外部工具引入,所以便查了下资料,现记录下来. 方法是: 1.在Eclipse环境下,打开下图中的最右边那个按钮. 2.新建一个Program,写上名字比如“javaH”,然后填写下面几项内容: 2.1.Location:把JDK下面的javaH.exe的全路径填进来. 2.2.Working Directory: Jav

使用预编译头提高编译速度

什么是预编译头 在介绍预编译头之前,有必要了解一下C/C++的编译方式.C/C++的编译单元是源文件(带有.c..cc..cpp等扩展名的文件),在编译一个源文件之前,预处理器会把这个源文件中所有通过#include指令包含进来的头文件递归地展开,也就是把所有直接或间接包含的头文件原封不动地插入进来.当这个过程结束之后,才开始编译. 这种编译方式的缺点是会使头文件被重复编译.假如有一百个源文件都包含了Windows.h,那么这个头文件会在一百个源文件中展开,它里面的代码会被重复编译了一百次,尽管

C++头文件编译问题

最近刚开始学习C++对头文件编译不是太清楚,运行程序总是出错. 1 #include "stdafx.h" 2 #include <iostream.h> 3 int main(int argc, char* argv[]) 4 { 5 float num1,num2,sum; 6 cout<<"Please enter num1:"<<endl; 7 cin>>num1; 8 cout<<"Pl

undefined reference to `libiconv_open 无法编译PHP

解决方法:#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz#tar -zxvf libiconv-1.13.1.tar.gz#cd libiconv-1.13.1# ./configure --prefix=/usr/local/libiconv# make# make install 再检查php,指定 iconv的位置  --with-iconv=/usr/local/libiconv#./configure -