[已解决]VIM使用MSVC编译器,make时如何提示“你输入的某函数未找到”

Vim、Emacs配置和使用
回复
fy0
帖子: 190
注册时间: 2011-06-27 0:57

[已解决]VIM使用MSVC编译器,make时如何提示“你输入的某函数未找到”

#1

帖子 fy0 » 2012-01-26 22:17

默认无法给出任何程序生成未果的提示。
方法直接跳转5楼

=============================================

啊,先说一下,我目前的编译器是MSVC。

但是make之后呢,发现提示了个没头没脑的(1/23)
这不科学啊!我一度以为是自己的山寨nmake调用程序写错了。
结果编译出waring或error的时候我才明白原来还没弄错。

可是不管怎么说你返回个编译成功或者失败啊,
这样算个怎么个情况……

何况msvc有个蛋疼的地方是编译的时候不检查函数名,无论写什么都能通过。
link时候才提示找不到某某符号,还不给出行号!
加上上面那个问题,这种情况是一个错误提示都没有的。。。
让我情何以堪……
上次由 fy0 在 2012-01-27 21:25,总共编辑 1 次。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: VIM的make配置在哪找?我觉得显示信息过少了。。

#2

帖子 sarrow » 2012-01-26 23:45

说实话,我看楼主的帖子,也感觉有点没头没脑的。

很久没用msvc了。不过,函数的定义是否存在,对于C/C++语言来说,都得拖到连接的时候,问题才会暴露出来吧?

如果是动态调用动态连接库的话,函数的定义是否存在,到连接阶段都不会知道。得到实际运行程序的时候。

不知道我有没有说错?
fy0
帖子: 190
注册时间: 2011-06-27 0:57

Re: VIM的make配置在哪找?我觉得显示信息过少了。。

#3

帖子 fy0 » 2012-01-27 0:23

sarrow 写了:说实话,我看楼主的帖子,也感觉有点没头没脑的。

很久没用msvc了。不过,函数的定义是否存在,对于C/C++语言来说,都得拖到连接的时候,问题才会暴露出来吧?

如果是动态调用动态连接库的话,函数的定义是否存在,到连接阶段都不会知道。得到实际运行程序的时候。

不知道我有没有说错?
确实,思维有点混乱。。
总之一句话:Make之后如何确切获知是否成功

既然是到了链接时候才能知道函数是否存在,那么为什么还能提示:实参太多?
说明内部有个函数表。

现在能否做两件事:
1) 让cl直接在编译时弹出错误(找不到函数)
2) 让链接阶段可以弹出错误(我的链接是用cl -o来做的,改变一下能否做到?)
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: VIM的make配置在哪找?我觉得显示信息过少了。。

#4

帖子 sarrow » 2012-01-27 10:29

既然是到了链接时候才能知道函数是否存在,那么为什么还能提示:实参太多?
感觉楼主基础知识缺缺阿!

函数有“声明”和“定义(实现)”的区分。

对于变量也是一样,有声明,也有定义。

编译时,针对函数调用的错误提示,其实就只是在分析函数的声明部分能不能和调用部分匹配起来。

如果找不到匹配的,就提示“函数没有定义”——至于该函数的实现,具体存在与否,在编译为obj文件这一步,编译器是不会管的!

而整个编译(源代码->obj文件->二进制本地代码(程序)这个动作)完成的时候,函数所谓的调用约定、参数列表这些信息都丢失了。函数就退化为一个地址而已(针对静态连接)。
fy0
帖子: 190
注册时间: 2011-06-27 0:57

Re: VIM的make配置在哪找?我觉得显示信息过少了。。

#5

帖子 fy0 » 2012-01-27 11:25

sarrow 写了:
既然是到了链接时候才能知道函数是否存在,那么为什么还能提示:实参太多?
感觉楼主基础知识缺缺阿!

函数有“声明”和“定义(实现)”的区分。

对于变量也是一样,有声明,也有定义。

编译时,针对函数调用的错误提示,其实就只是在分析函数的声明部分能不能和调用部分匹配起来。

如果找不到匹配的,就提示“函数没有定义”——至于该函数的实现,具体存在与否,在编译为obj文件这一步,编译器是不会管的!

而整个编译(源代码->obj文件->二进制本地代码(程序)这个动作)完成的时候,函数所谓的调用约定、参数列表这些信息都丢失了。函数就退化为一个地址而已(针对静态连接)。
你的意思我明白,但是你误解了我的意思。
你是说编译器是个二杆子,不管函数有没有只管把函数信息写进去,
到了link的时候再去按照信息进行拼装。

但是,既然能够提示“实参太多”(比如strdup(a,b,c)这种明显胡搞的写法),
说明编译器并非完全的不作为(至少正如你说的检查了函数声明)。
vc编译器至少获知了这个函数在现有的头文件(实现时候或许是读取库文件?)中是否存在,但是他没有报!

尽管这是一个正常的编译行为,但是对我的编程造成了影响。
现在寻找的是一种可能性,让编译器将它知道的这段内容告诉我,
或是让链接器返回的错误信息带上行号,以便在quickfix窗口告诉我。

=======================

自己解决了,这个思路果然没错。
mscv编译时候给$(CC)带上/W3选项(/Wall也可)就能提示了,提示为warning
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: [已解决]VIM使用MSVC编译器,make时如何提示“你输入的某函数未找到”

#6

帖子 sarrow » 2012-01-28 21:58

恭喜。

其实我猜测有工具能办得到,一直在等待某某人回答。没想到你自己解决了。
回复