cflags

本文介绍了如何通过正确配置CFLAGS、LDFLAGS和LIBS来解决编译链接问题,包括指定头文件路径、库文件位置及链接库文件的方法,并给出了解决运行时链接器找不到库文件的具体步骤。
在configure时我们经常会遇到明明已经指令了目录但有时就是链接不了的情况,解决方法及原因如下(引用自http://www.cnblogs.com/taskiller/archive/2012/12/14/2817650.html) 


CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。 

LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。 

LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv 

简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。不过使用时链接阶段这两个参数都会加上,所以你即使将这两个的值互换,也没有问题。 

有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R": 

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib 

如果在执行./configure以前设置环境变量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意设置环境变量等号两边不可以有空格,而且要加上引号(shell的用法)。那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。
在配置C语言编译器标志时,通常涉及对`CFLAGS`环境变量的设置,该变量用于指定编译器在编译C语言源代码时应使用的选项。`CFLAGS`可以在`./configure`脚本执行时通过命令行传递,也可以在构建系统的配置文件中定义。以下是关于如何配置`CFLAGS`的详细说明。 ### 配置 `CFLAGS` 的方式 1. **通过 `./configure` 命令行传递 `CFLAGS`** 在执行 `./configure` 脚本时,可以直接在命令行中指定 `CFLAGS` 的值。例如,要启用优化并生成带有调试信息的代码,可以使用以下命令: ```bash ./configure CFLAGS="-O2 -g" ``` 此方法会将指定的编译器标志传递给 `configure` 脚本,并在生成的 `Makefile` 中使用这些标志。 2. **在环境变量中预先设置 `CFLAGS`** 也可以在运行 `./configure` 之前,通过设置环境变量 `CFLAGS` 来指定编译器标志。例如,在 Bash shell 中可以这样做: ```bash export CFLAGS="-Wall -Wextra -O3" ./configure ``` 这种方式的优点是,`CFLAGS` 的值将影响所有后续的编译步骤,而不仅仅是当前的 `./configure` 执行。 3. **修改 `Makefile` 或其他构建配置文件** 如果项目已经生成了 `Makefile`,可以在 `Makefile` 中直接修改 `CFLAGS` 的值。例如: ```makefile CFLAGS = -std=c99 -pedantic -Werror ``` 这种方法适用于项目已经完成配置阶段,并且需要临时调整编译器标志的情况。 4. **在 `configure.ac` 或 `Makefile.am` 中定义默认 `CFLAGS`** 对于使用 Autotools 构建的项目,可以在 `configure.ac` 或 `Makefile.am` 文件中定义默认的编译器标志。例如,在 `configure.ac` 中添加以下内容可以启用特定的编译器标志: ```m4 AC_SUBST([CFLAGS], ["-march=native -mtune=native"]) ``` 在 `Makefile.am` 中,可以指定: ```makefile AM_CFLAGS = -Wno-unused-parameter ``` ### 常见的 `CFLAGS` 选项 - **优化选项** - `-O0`:不进行优化(默认值)。 - `-O1`、`-O2`、`-O3`:逐步增加优化级别。 - `-Ofast`:启用所有优化选项,可能违反严格的标准合规性。 - **调试选项** - `-g`:生成调试信息,便于使用 GDB 等调试工具。 - `-ggdb`:生成 GDB 专用的调试信息。 - **警告选项** - `-Wall`:启用所有常见警告。 - `-Wextra`:启用额外的警告。 - `-Werror`:将所有警告视为错误。 - **标准合规性选项** - `-std=c89`、`-std=c99`、`-std=c11`:指定使用哪个 C 语言标准。 - `-pedantic`:严格按照标准检查代码。 - **架构相关选项** - `-march=native`:为本地架构生成优化代码。 - `-mtune=native`:调整代码以匹配本地处理器。 ### 注意事项 - 在设置 `CFLAGS` 时,应确保所使用的编译器支持指定的选项。例如,某些较旧版本的 GCC 可能不支持 `-std=c11`。 - 如果 `./configure` 报错,例如 `C compiler cannot create executables` [^2],可能是由于 `CFLAGS` 中包含不兼容的选项或编译器路径配置错误。 - 对于复杂的项目,建议参考 `./configure --help` 获取支持的选项列表 [^4]。 ### 示例代码 以下是一个简单的 `Makefile` 示例,展示了如何在构建过程中使用 `CFLAGS`: ```makefile CC = gcc CFLAGS = -Wall -Wextra -O2 -g OBJS = main.o utils.o TARGET = myprogram all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $@ $^ clean: rm -f $(OBJS) $(TARGET) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值