命令行指定 CFLAGS 不生效

dpdk 的 Makefile 中有对 CFLAGS 的设定,在很多 Makefile 单独设定了 CFLAGS 增加 -O3 参数。

下面是 dpdk-17.05 中一些 Makefile 在 CFLAGS 标志中增加 -O3 选项的语句。

.......
./lib/librte_reorder/Makefile:37:CFLAGS += -O3
./drivers/net/fm10k/Makefile:39:CFLAGS += -O3
./drivers/net/tap/Makefile:42:CFLAGS += -O3
./drivers/net/pcap/Makefile:40:CFLAGS += -O3
./drivers/net/sfc/Makefile:38:CFLAGS += -O3
./drivers/net/vhost/Makefile:41:CFLAGS += -O3
./drivers/net/null/Makefile:39:CFLAGS += -O3
./drivers/net/mlx4/Makefile:47:CFLAGS += -O3
./drivers/net/af_packet/Makefile:45:CFLAGS += -O3
........

全局设定 export CFLAGS=" -O0 0g"后重新编译发现还是使用了 -O3 编译,这表明 dpdk 的编译脚本中对 CFLAGS 的值重新进行了设定,不能通过命令行指定 CFLAGS 来编译出 debug 版本。

在 doc 目录下找到了如下相关内容:

331 Variables that Can be Set/Overridden in a Makefile Only
332 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
333
334 *   VPATH: The path list that the build system will search for sources. By default, RTE_SRCDIR will be included in VPATH.
335
336 *   CFLAGS: Flags to use for C compilation. The user should use +=  to append data in this variable.
337

从上面的内容中可以看出,用户不能通过命令行设定 CFLAGS,只能通过 Makefile 文件来设定。

命令行设置 EXTRA_CFLAGS 标志生成 debug 版

继续阅读 doc 目录中的帮助文档,我发现 EXTRA_CFLAGS 标志可以使用。文档中相关的内容摘取如下:

Variables that Can be Set/Overridden by the User in a Makefile or Command Line
389 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
390
391 *   CFLAGS_my_file.o: Specific flags to add for C compilation of my_file.c.
392
393 *   LDFLAGS_my_app: Specific flags to add when linking my_app.
394
395 *   EXTRA_CFLAGS: The content of this variable is appended after CFLAGS when compiling.
396
397 *   EXTRA_LDFLAGS: The content of this variable is appended after LDFLAGS when linking.
398
399 *   EXTRA_LDLIBS: The content of this variable is appended after LDLIBS when linking.
400
401 *   EXTRA_ASFLAGS: The content of this variable is appended after ASFLAGS when assembling.
402
403 *   EXTRA_CPPFLAGS: The content of this variable is appended after CPPFLAGS when using a C preprocessor on assembly files.

上面的介绍表明 EXTRA_CFLAGS 变量可以通过命令行进行设定,同时它会在编译时追加到 CFLAGS 内容之后。

执行 export EXTRA_CFLAGS="-O0 -g" 后重新编译 dpdk 的库,使用 gdb 调试 app 目录下生成的可执行文件发现 gdb 能够读取到调试信息。

虽然有了调试信息,但是 Makefile 中对 CFLAGS 变量增加的 -O3 选项可能意味着编译出来的是 O3 版本的程序,这样就不能算作是 debug 版本。

我查看编译编译目录中 *.o.cmd 中保存的编译命令,发现库函数的编译命令中同时设定了 -O3 与 -O0 -g 参数。

示例如下:

[longyu@debian-10:22:02:09] x86_64-native-linuxapp-gcc $ cat ./build/lib/librte_eal/linuxapp/eal/.eal_alarm.o.cmd
cmd_eal_alarm.o = gcc -Wp,-MD,./.eal_alarm.o.d.tmp  -m64 -pthread  -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_RDRAND -DRTE_MACHINE_CPUFLAG_FSGSBASE -DRTE_MACHINE_CPUFLAG_F16C -DRTE_MACHINE_CPUFLAG_AVX2  -I/home/longyu/Downloads/dpdk-stable-17.02.1/x86_64-native-linuxapp-gcc/include -include /home/longyu/Downloads/dpdk-stable-17.02.1/x86_64-native-linuxapp-gcc/include/rte_config.h -I/home/longyu/Downloads/dpdk-stable-17.02.1/lib/librte_eal/linuxapp/eal/include -I/home/longyu/Downloads/dpdk-stable-17.02.1/lib/librte_eal/common -I/home/longyu/Downloads/dpdk-stable-17.02.1/lib/librte_eal/common/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -O3  -O0 -g  -o eal_alarm.o -c /home/longyu/Downloads/dpdk-stable-17.02.1/lib/librte_eal/linuxapp/eal/eal_alarm.c

查看到编译命令,我想到了一个问题——指定了多个优化选项时 gcc 编译时会使用哪个呢?

gcc 同时指定多个优化选项的问题

经过搜索,我发现 gcc 的官方网页中对这个问题进行了描述。当 gcc 编译命令中指定了多个优化选项时,只有最后一个优化选项生效。

-O3 是在 CFLAGS 变量中指定的,EXTRA_CFLAGS 是我们在命令行中指定的,根据 dpdk 的帮助文档中的说明,EXTRA_CFLAGS 的值会在编译时追加到 CFLAGS 的值后,这样我们就看到了有 -O3 … -O0 -g 这样的编译命令。

-O0 是最后一个指定的优化选项,实际生效的是 -O0,而非 -O3,这样我们通过设定 EXTRA_CFLAGS 为 -O0 -g 就能够编译出 debug 版本的 dpdk。

备注: EXTRA_CFLAGS 是在 mk/internal/rte.compile-pre.mk 中使用的。

最终确定的编译 dpdk debug 版本的方法

命令行中执行如下命令设定 EXTRA_CFLAGS 后重新编译即可。

export EXTRA_CFLAGS="-O0 -g"

设置 EXTRA_CFLAGS 以编译 debug 版本 dpdk 库相关推荐

  1. linux release 版本的区别,编译debug版本和编译release版本的区别

    大项目的版本编译会区别debug和release,那debug和release会有什么区别呢? 通过对比这两者的编译选项可以找到答案. 1.对比编译过程 debug: -DOS_LINUX  -DDE ...

  2. libevent linux 编译,libevent 编译debug版本

    最近要把linux下面的代码移植到windows下面,因为用到了libevent,需要编译一下. windows 7下编译: 编译环境: windows 7 + VS2010 (1)解压libeven ...

  3. CMake添加-g编译选项/CMake编译Debug版本

    目录 方法1:修改CMakeLists.txt 方法2:命令行配置 方法1:修改CMakeLists.txt 在文件 CMakeLists.txt添加下面一条语句 add_definitions(&q ...

  4. GCC编译Debug版本正常,Release版本异常

    解决方法: 使用检查工具(如cppcheck)或者编译时查看warning信息,将所有的warning修复. 主要检查每个函数的返回值是否遗漏,若遗漏,则两个版本的结果会不同,Release版本一般行 ...

  5. HDF5 windows编译 release版本、Debug版本

    由于最近急需的一个项目,需要hdf5库,误打误撞,编译成功.特此记录 1.下载源代码 官网下载地址:https://portal.hdfgroup.org/display/support/HDF5+1 ...

  6. 使用VS2010编译64的Geos库

    Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...

  7. GDAL源码剖析(八)之编译GEOS和PROJ4库

    在用到GDAL时,经常会用到Proj4和GEOS,关于这两个库的作用,可以到其官网看看.下面编译是在Windows环境下,编译器使用MS的VS2008. 一.编译PROJ4 PROJ4的最新版本是4. ...

  8. Windows下用vs2017编译和配置libcurl库(手把手教,适合新人)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 libcurl是什么? libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当 ...

  9. windows10下QT6.4.3编译qsqlmysql Debug+Release动态库

    QT6版本以上没有mysql的动态库,需要自己编译,网上找了好多教程都没有成功编译,后面结合多个教程慢慢倒腾 终于成功了,具体操作步骤如下: 1,首先下载安装QT的时候 需要安装它的源码 2,安装完成 ...

最新文章

  1. 稀疏自编码器及TensorFlow实现
  2. Windows 10 LTSC添加UWP支持
  3. Python格式化字符串、占位符、合并数组
  4. JS URL Parser
  5. 前端学习(3242):react总结生命周期
  6. php多文件上传存储到表,PHP 实现一种多文件上传的方法
  7. dll文件 修改特征码_Could not load dynamic library cublas64_10.dll
  8. 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层(转)...
  9. Python Poetry管理包安装速度慢的解决办法
  10. 矩孔菲涅尔衍射 matlab,圆孔矩孔的菲涅尔衍射模拟(matlab实现)-工程光学.docx
  11. 实时数据采集-免费实时数据采集软件
  12. UR5 UR10 ------六自由度机械臂
  13. 谷歌、亚马逊在区块链都耽搁了什么 竟让后起的脸书名声大噪
  14. coolie PK webpack 之三:模块构建
  15. 信息系统项目管理师考试心得
  16. php在广告策划方面需要什么,网上推广网店运营 系统是基于PHP+MySQL的B2B(电子商务)行业门户解决方案”是什么意思呢,谢谢...
  17. python运行报错怎么看_解决python运行启动报错问题
  18. 教程二:windows api(c mfc vs2017)实现U盘插拔检测,获取U盘容量,U盘内容移动,开启和关闭U盘以及获取盘符等
  19. 重生之丹王,炼丹入门
  20. 梁勇(Danniel Liang) java教材例题:java程序购买额按税率求营业税 java中数值保留2位小数的方法...

热门文章

  1. 360安全卫士怎么登录问题
  2. [IL2CPP] 在编译时获取struct的大小
  3. 在软件测试领域,Java和Python哪个更适合做自动化测试?
  4. js进行搜索数组,实现搜索
  5. linux卸载virbox,Ubuntu16.04下安装virtualbox,配置及卸载
  6. Linux 环境下针对进程维度的监控实现
  7. redis分布式锁之redisson可重入锁
  8. PostGresql中日期转时间戳
  9. 计算机网络技术专业适合女生学吗,计算机网络技术专业适合女生学吗?
  10. 南开大学软件学院2021年秋季学期研究生算法课程(复习)动态规划