c++ 在编译时对define所定义的变量是怎么处理的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 在编译时对define所定义的变量是怎么处理的?相关的知识,希望对你有一定的参考价值。
我知道普通的变量和函数,好像是在编译的时候会生成一个Obj的目标文件!那#define EXT 4;之类的怎么处理呢
宏定义在编译的时候进行替换。#define EXT 4 不安全,建议修改成 #define EXT (4)追问
那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?
追答你需要相同还是不同?
如果需要定义相同,定义在一个同文件,其他使用文件包含此同文件即可。
如果需要定义不同,1: 修改各个宏,保证名字不同,这样风险低。
2: 不用修改宏,但保证各个文件相互无包含。那么宏仅仅作用于自身所在文件。
那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?
追答#define EXT 4 的有效范围仅限于定义文件。
参考技术B 对define处理是在编译之前进行的.会把所有的EXT都替换为4.追问
那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?
追答各自用各自的啊.
参考技术C 这种情况它不叫变量,也不是常量,只是简单字符串代替,编译的时候换回去,这样做只是为了编写和阅读代码更方便更易懂libcvd - 编译 C++ 时对“x ...”的未定义引用
【中文标题】libcvd - 编译 C++ 时对“x ...”的未定义引用【英文标题】:libcvd - undefined reference to "x..." while compiling c++ 【发布时间】:2013-04-18 08:16:53 【问题描述】:我正在尝试构建 libCVD 以便与 ROS 一起使用(来自 www.ros.org)。 我的问题是我收到以下错误:
make[3]: Entering directory `/opt/ros/groovy/stacks/tum_ardrone/thirdparty/libcvd/build'
/usr/bin/g++-4.6 -o progs/cvd_display_image progs/cvd_display_image.o -L. -lcvd -ltiff -ljpeg -lpng -lpng -llapack -lGLU -lGL -lrt -L -lX11 -lXext -pthread
./libcvd.so: undefined reference to `XMoveWindow'
./libcvd.so: undefined reference to `XCreateGlyphCursor'
./libcvd.so: undefined reference to `XStoreName'
./libcvd.so: undefined reference to `XLookupString'
./libcvd.so: undefined reference to `XFreeFont'
./libcvd.so: undefined reference to `XSetClassHint'
./libcvd.so: undefined reference to `XCreateWindow'
./libcvd.so: undefined reference to `XCreateColormap'
./libcvd.so: undefined reference to `XOpenDisplay'
./libcvd.so: undefined reference to `XDestroyWindow'
./libcvd.so: undefined reference to `XCloseDisplay'
./libcvd.so: undefined reference to `XUnmapWindow'
./libcvd.so: undefined reference to `XNextEvent'
./libcvd.so: undefined reference to `XSetWMProtocols'
./libcvd.so: undefined reference to `XResizeWindow'
./libcvd.so: undefined reference to `XMapWindow'
./libcvd.so: undefined reference to `XSelectInput'
./libcvd.so: undefined reference to `XFlush'
./libcvd.so: undefined reference to `XWarpPointer'
./libcvd.so: undefined reference to `XLoadQueryFont'
./libcvd.so: undefined reference to `XDefineCursor'
./libcvd.so: undefined reference to `XInternAtom'
./libcvd.so: undefined reference to `XQueryPointer'
./libcvd.so: undefined reference to `XUndefineCursor'
./libcvd.so: undefined reference to `XGetWindowAttributes'
./libcvd.so: undefined reference to `XPending'
collect2: ld returned 1 exit status
make[3]: *** [progs/cvd_display_image] Error 1
make[3]: Leaving directory `/opt/ros/groovy/stacks/tum_ardrone/thirdparty/libcvd/build'
make[2]: *** [libcvd_built] Error 2
还有一个包含几乎类似错误的其他 *** 问题 (undefined reference error while compiling libcvd)。
我尝试了那里的建议,以找出为什么第二个 -L 选项没有给出路径。所以我最终进入了项目 configure.in 文件,我相信错误发生在该文件中。 但我对这个构建系统没有经验,所以帮助会很大。
configure.in 文件在https://dl.dropboxusercontent.com/u/16804463/configure.in 下可用
提前致谢。
【问题讨论】:
【参考方案1】:在另一个 SO 问题中选择的解决方案不正确。正确的解决方案是未选择的解决方案:错误是您的链接行中缺少路径。您的链接行包含:-L -lX11
。 -L
后面应该有一个路径名。由于没有,链接器假定路径名是下一个参数,-lX11
。这意味着链接器不会链接实际的 libX11.so
库,因为它将库引用视为路径。
您需要查看您的Makefile
并找到链接 cvd_display_image.o 目标的规则,看看这里发生了什么。如另一个 SO 答案中所述,您很可能会发现链接行类似于 -L$(SOME_VARIABLE)
并且该变量为空。您需要将该变量设置为某个值,可能通过运行make SOME_VARIABLE=.
或make SOME_VARIABLE=/usr/lib
或其他方式。
查看configure.in
文件不是很有用:重要的部分是makefile。
在任何情况下,您都应该将此情况报告给该软件的维护人员,以便他们进行修复:显然,他们在这里遇到了一个真正的错误,因为很多人都遇到了这个问题。
【讨论】:
【参考方案2】:我有类似的错误。 我意识到 libcvd 似乎依赖于以下 3 个库。
拉包 废话 香椿这些都是数学库。 从 Ubuntu 软件中心安装 Synaptic 软件包管理器。 (假设你使用的是 ubuntu - 如果你不是,你可以使用 apt-get 或其他方式安装包)
在 Synaptic 包管理器中,搜索以下包:
liblapack 开发 libblas 开发并安装。
安装TooN: git clone git clone git://github.com/edrosten/TooN.git 这将在您将其克隆到的任何位置创建一个 TooN 目录。导航到 TooN 目录并输入:
./配置
制作
进行安装
希望这会有所帮助。
【讨论】:
以上是关于c++ 在编译时对define所定义的变量是怎么处理的?的主要内容,如果未能解决你的问题,请参考以下文章
define和unsigned int在单片机中都是定义的意思,在应用中怎么区分,谢谢