c++ 在编译时对define所定义的变量是怎么处理的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 在编译时对define所定义的变量是怎么处理的?相关的知识,希望对你有一定的参考价值。

我知道普通的变量和函数,好像是在编译的时候会生成一个Obj的目标文件!那#define EXT 4;之类的怎么处理呢

宏定义在编译的时候进行替换。
#define EXT 4 不安全,建议修改成 #define EXT (4)追问

那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?

追答

你需要相同还是不同?
如果需要定义相同,定义在一个同文件,其他使用文件包含此同文件即可。
如果需要定义不同,1: 修改各个宏,保证名字不同,这样风险低。
2: 不用修改宏,但保证各个文件相互无包含。那么宏仅仅作用于自身所在文件。

参考技术A 以#开头的命令叫编译预处理命令,这此命令是在编译前进行处理的。若程序开始有#define EXT 4,则编译前就会用查找替换命令将程序中所有的EXT替换成4。追问

那有很多文件都有#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在单片机中都是定义的意思,在应用中怎么区分,谢谢

C/C++中define定义的常量与const常量

c++中 #define和const的区别

C++ 中define(宏定义) 各种用法(含特殊),小举个例子,谢谢!

#ifndef, #define, #endif 作用

怎么把C语言中定义的符号变量替换为对应的常量?求代码