关于error LNK2001: unresolved external symbol _printf的问题

htyx 2009-12-09 04:46:37
我用c写的lib,给别人用生成的一个dll

结果却链接不到 printf malloc free之类的函数

用vc6.0编译的,我看了下他的工程设置,kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib之类的库也都加了。

不知道还应该检查那里?请大家给点意见吧。
...全文
1562 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
htyx 2009-12-11
  • 打赏
  • 举报
回复
我的lib和调用的lib的程序是同一个编译器。
lgccaa 2009-12-11
  • 打赏
  • 举报
回复
http://hi.baidu.com/198659/blog/item/5b7d18df37100a196227983c.html
不同编译器编译的函数命名是不一样的
htyx 2009-12-11
  • 打赏
  • 举报
回复
以前程序是在gcc编的。现在同事要仿真。是个vc编的程序。

不过我给他的lib是vc编出来的,之后我也用vc写了个小程序调用了下我的lib。都是没问题的。
「已注销」 2009-12-11
  • 打赏
  • 举报
回复
如果你朋友用的是GCC,而你用的是VC,那出现链接错误很正常。
或者反过来,也如此。
「已注销」 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 htyx 的回复:]
我写的代码是没问题的,自己写个程序去调用也编的过。只是不知道我同事那个东东是怎么回事。我看了下他的程序extern "C"也还是加了的。
[/Quote]
请确保编译器一致,以及注意下编译器版本高底的兼容问题。
htyx 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 loaden 的回复:]
引用 14 楼 htyx 的回复:
这个应该就是没有链接基本库,不过我手动在链接选项里面已经把基本库加上了。而且也没有像jamesf1982说的在设置里面勾上了ignore all default lib选项。但那个东东就是不找不到。没有想法了。等下导出makefile来看看吧。

问题不在于printf函数在哪个库里。
问题在:C编译器编译出来的库(/Tc),要想给C++使用(/Tp),在包含相应头文件时,就应当声明extern "C" 后再包含,否则会出现奇怪的链接错误!
[/Quote]

我写的代码是没问题的,自己写个程序去调用也编的过。只是不知道我同事那个东东是怎么回事。我看了下他的程序extern "C"也还是加了的。
晴天1999 2009-12-09
  • 打赏
  • 举报
回复
新手哈!多多指教哟!
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
你试了我2楼的方法了吗?
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 htyx 的回复:]
这个应该就是没有链接基本库,不过我手动在链接选项里面已经把基本库加上了。而且也没有像jamesf1982说的在设置里面勾上了ignore all default lib选项。但那个东东就是不找不到。没有想法了。等下导出makefile来看看吧。
[/Quote]
问题不在于printf函数在哪个库里。
问题在:C编译器编译出来的库(/Tc),要想给C++使用(/Tp),在包含相应头文件时,就应当声明extern "C" 后再包含,否则会出现奇怪的链接错误
htyx 2009-12-09
  • 打赏
  • 举报
回复
这个应该就是没有链接基本库,不过我手动在链接选项里面已经把基本库加上了。而且也没有像jamesf1982说的在设置里面勾上了ignore all default lib选项。但那个东东就是不找不到。没有想法了。等下导出makefile来看看吧。
niu05500230 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jamesf1982 的回复:]
引用 8 楼 versaariel 的回复:
学习了,我去G了一下,是不是可以这么理解:
a.lib,a.h是你用C编译器编译的
现在你要生成新的lib和dll
b.lib b.dll
vc6是C++编译器,链接的时候它是按C++的命名方式查找a.lib中的printf,free,malloc,所以就没找到
对头加入了extern "c"后
C++链接器就按照C命名方式来查找,所以就能找到
理解的不对的地方请大家指正
我看的是这篇
http://blog.chinaunix.net/u/29619/showart_230148.html


你所说的不正确,printf这些都是基本的库函数,不用加extern "c"。

因为你是连这些基本库函数都没找到,基本可以确定你没有包含基本的库文件。ls几位都说了可能的问题了,建议你查一下工程设置。


[/Quote]

同意,建议检查一下是否包含了相关的库函数头文件
z569362161 2009-12-09
  • 打赏
  • 举报
回复
人家提问,你两个聊天太不像话了。

LZ我也用VC6,你先去看看对不对,

有疑问回来在说。
versaariel 2009-12-09
  • 打赏
  • 举报
回复
好的,学习了
james_hw 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 versaariel 的回复:]
学习了,我去G了一下,是不是可以这么理解:
a.lib,a.h是你用C编译器编译的
现在你要生成新的lib和dll
b.lib b.dll
vc6是C++编译器,链接的时候它是按C++的命名方式查找a.lib中的printf,free,malloc,所以就没找到
对头加入了extern "c"后
C++链接器就按照C命名方式来查找,所以就能找到
理解的不对的地方请大家指正
我看的是这篇
http://blog.chinaunix.net/u/29619/showart_230148.html
[/Quote]

你所说的不正确,printf这些都是基本的库函数,不用加extern "c"。

因为你是连这些基本库函数都没找到,基本可以确定你没有包含基本的库文件。ls几位都说了可能的问题了,建议你查一下工程设置。

goodname 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 loaden 的回复:]
goodname最近很少露面啊?
工作很忙吧。
[/Quote]

公司事情很多,基本上很少来了。不过每次来总看到你在。
versaariel 2009-12-09
  • 打赏
  • 举报
回复
学习了,我去G了一下,是不是可以这么理解:
a.lib,a.h是你用C编译器编译的
现在你要生成新的lib和dll
b.lib b.dll
vc6是C++编译器,链接的时候它是按C++的命名方式查找a.lib中的printf,free,malloc,所以就没找到
对头加入了extern "c"后
C++链接器就按照C命名方式来查找,所以就能找到
理解的不对的地方请大家指正
我看的是这篇
http://blog.chinaunix.net/u/29619/showart_230148.html
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 goodname 的回复:]
应该检查下工程设置,看看运行时库的设置
c/c++ -> code generation -> use run-time library
[/Quote]
goodname最近很少露面啊?
工作很忙吧。
goodname 2009-12-09
  • 打赏
  • 举报
回复
应该检查下工程设置,看看运行时库的设置
c/c++ -> code generation -> use run-time library
james_hw 2009-12-09
  • 打赏
  • 举报
回复
我之前遇到过lz的问题,当时就是不小心把那个选项给勾上了。。。
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
其中,extern "C" 的作用是:请向google.com咨询。
加载更多回复(3)

70,013

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧