SetPixel等函数检测到未定义

六道佩恩 2019-04-23 11:19:26
代码如下:

#include "windows.h"
int main( void )
{
HDC hdc = GetWindowDC(NULL);
SetPixel(hdc, 0, 0, RGB(255,0,0));
ReleaseDC(NULL, hdc);
return 0;
}

VC下编译通过且正常实现
但dev和CodeBlocks编译不通过,dev下报错“undefined reference to `__imp_SetPixel'”,CodeBlocks报错“undefined reference to `SetPixel@16'|”,我检查过,dev下是有SetPixel的声明的,在wingdi.h,那么它报错是因为没有库的实现吗?可是有libgdi32.a和libgdiplus.a,这不就是实现的库吗?
求解答。
...全文
1279 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stherix 2019-04-23
  • 打赏
  • 举报
回复
msvc和gcc用的头文件/库并不是同一套,它们都有各自的实现 msvc估计是会自动去lib配置里去找需要的库,并且链接进来,或者它的头文件里就有#pragma comment(lib,"xxxx")引入 gcc除了最基本的库,其他的都需要你手动包含
六道佩恩 2019-04-23
  • 打赏
  • 举报
回复
引用 3 楼 ooolinux 的回复:
控制台项目还是win32项目?
控制台呀,,,看main不就看出来了吗
ooolinux 2019-04-23
  • 打赏
  • 举报
回复
控制台项目还是win32项目?
六道佩恩 2019-04-23
  • 打赏
  • 举报
回复
我测试手动包含静态库发现可以实现了 gcc hdc.c -o hdc.exe -lgdi32 那么,现在的问题是,,,为啥它有库却没有去包含?包含哪些库由什么决定?
@风轻云淡_ 2019-04-23
  • 打赏
  • 举报
回复
#include "windows.h"
换成
#include <windows.h>
试一下
  • 打赏
  • 举报
回复
引用 8 楼 六道佩恩 的回复:
[quote=引用 6 楼 早打大打打核战争 的回复:]
这就是C++的一个缺陷(从C带来的),头文件和库之间没有对应关系,后来的语言都对这个问题做了改进,诸如Delphi的uses、C#的using、Java的import等等

这个是跟语言有关还是编译器有关?会不会是在哪里记录了头文件与库的索引?[/quote]

严格来说是实现相关的,比如MASM中就有个includelib,指出需要链接某个库,如果在头文件中增加一个预处理指令,比如叫#includelib就解决了
stherix 2019-04-23
  • 打赏
  • 举报
回复
引用 7 楼 六道佩恩 的回复:
[quote=引用 5 楼 stherix 的回复:] msvc和gcc用的头文件/库并不是同一套,它们都有各自的实现 msvc估计是会自动去lib配置里去找需要的库,并且链接进来,或者它的头文件里就有#pragma comment(lib,"xxxx")引入 gcc除了最基本的库,其他的都需要你手动包含
在gcc上用了许多windows的函数,鼠标模拟、键盘模拟、控制台函数、窗口移动与创建、消息的接收与发送等等,这些算常用吗?目前都正常使用不用包含,但同样身为windows api的画图函数却需要包含,,感觉有点怪,不知道是不是有哪里记录了头文件的与实现库的索引?[/quote] msvc的头文件支持指示嵌入lib文件的写法,只要你引用了这个头文件,他一般会帮你导入lib 但是这不是c/c++标准,所以gcc必须自己写在编译连接命令里
六道佩恩 2019-04-23
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
这就是C++的一个缺陷(从C带来的),头文件和库之间没有对应关系,后来的语言都对这个问题做了改进,诸如Delphi的uses、C#的using、Java的import等等
这个是跟语言有关还是编译器有关?会不会是在哪里记录了头文件与库的索引?
六道佩恩 2019-04-23
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
msvc和gcc用的头文件/库并不是同一套,它们都有各自的实现 msvc估计是会自动去lib配置里去找需要的库,并且链接进来,或者它的头文件里就有#pragma comment(lib,"xxxx")引入 gcc除了最基本的库,其他的都需要你手动包含
在gcc上用了许多windows的函数,鼠标模拟、键盘模拟、控制台函数、窗口移动与创建、消息的接收与发送等等,这些算常用吗?目前都正常使用不用包含,但同样身为windows api的画图函数却需要包含,,感觉有点怪,不知道是不是有哪里记录了头文件的与实现库的索引?
  • 打赏
  • 举报
回复
这就是C++的一个缺陷(从C带来的),头文件和库之间没有对应关系,后来的语言都对这个问题做了改进,诸如Delphi的uses、C#的using、Java的import等等

70,020

社区成员

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

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