ffmpeg库在qmake下的pkg-config配置

在使用qmake编译ffmpeg库时,通过`./configure`设置了额外的编译和链接选项,包括启用多个编码器和库支持。然而,在尝试编译doc/examples的示例时遇到链接错误,提示av_err2str未定义。问题出在直接拷贝pkgconfig文件到系统目录不生效,正确的做法是将pkgconfig路径添加到环境变量PKG_CONFIG_PATH中。

qmake编译的选项:

./configure --extra-cflags=-I/home/wayne/out/include --extra-ldflags=-L/home/wayne/out/lib --enable-libx264 --enable-encoder=libx264 --enable-libfaac --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-x11grab --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx265 --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-network --enable-protocol=tcp --enable-demuxer=rtsp --enable-decoder=h264 


然后试着用qmake编译doc/examples下的例子,却出错了

avio_reading.c:129:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
g++ -m64 -Wl,-O1 -o testFfmpeg avio_reading.o   -lavcodec -lavutil -lavformat -lswscale -lsoxr 
avio_reading.o: In function `main':
avio_readin

<think> 我们正在讨论qmake中的CONFIG条件语法,特别是`CONFIG(debug, debug|release)`这种形式。根据之前的讨论,这种语法用于根据构建模式(debug或release)来设置不同的配置。 首先,回顾一下用户的问题:用户想了解`qmake CONFIG(, |)`语法的详解。这里的`CONFIG(, |)`指的是`CONFIG(condition, scope)`的形式,其中第一个参数是要检测的条件,第二个参数是作用域列表。 在qmake中,`CONFIG`变量用于存储项目的配置选项。我们可以使用条件判断来根据`CONFIG`中的值执行不同的操作。 ### 语法结构 `CONFIG(condition, scope)`是一个条件判断语句,用于检查在给定的作用域(scope)中,某个条件(condition)是否被满足。它的基本形式是: ```qmake CONFIG(condition1, condition1|condition2|...) { # 当condition1在指定的作用域中被激活时,执行这里的代码 } ``` ### 参数解释 1. **第一个参数**:要检查的条件(例如`debug`、`release`)。 2. **第二个参数**:一个用竖线`|`分隔的作用域列表。这个列表定义了在哪些配置作用域中检查条件。通常,我们会使用互斥的配置(如`debug|release`)来确保条件在特定的作用域中被检查。 ### 工作机制 当qmake处理到`CONFIG(condition, scope)`时,它会检查在`scope`所列的配置中,是否包含`condition`。注意,它只会在`scope`列出的配置中检查,而忽略其他配置。这样,我们可以避免非相关配置的干扰。 例如,`CONFIG(debug, debug|release)`表示:在`debug`或`release`配置中,如果当前配置包含`debug`,则执行对应的代码块。由于`debug`和`release`通常是互斥的(即不会同时激活,尽管qmake允许同时设置,但实际构建时只有一个生效),所以这个条件通常用于判断当前是否为debug模式。 ### 示例解析 我们来看一个常见的例子: ```qmake CONFIG(debug, debug|release) { DESTDIR = debug LIBS += -lmydebuglib } CONFIG(release, debug|release) { DESTDIR = release LIBS += -lmyreleaselib } ``` - 当构建模式为debug(即`CONFIG`中包含`debug`)时,第一个代码块执行,设置输出目录为`debug`,并链接调试版的- 当构建模式为release(即`CONFIG`中包含`release`)时,第二个代码块执行,设置输出目录为`release`,并链接发布版的。 ### 注意事项 1. **优先级问题**:如果同时设置了`debug`和`release`(虽然不常见),那么由于`CONFIG(debug, debug|release)`写在前面,它会优先匹配,因此debug的代码块会执行。所以,通常我们按照互斥的情况来使用。 2. **作用域限制**:第二个参数的作用域限制非常重要。例如,如果我们有另一个配置选项`static`,那么`CONFIG(debug, debug|release)`不会因为`static`的存在而受到影响,它只关注`debug`和`release`。 3. **与简单条件判断的区别**:如果不使用第二个参数,例如`CONFIG(debug)`,那么只要`CONFIG`中包含`debug`(无论其他配置如何),条件都会成立。而使用第二个参数则限定了只考虑特定作用域。 ### 实际应用 根据引用中的例子: - 引用[2]和[3]展示了在链接不同时的应用,如OpenCV的调试版和发布版- 引用[4]展示了在pro文件中使用`CONFIG`变量来添加配置,如`CONFIG += link_pkgconfig`。 ### 其他用法 除了构建模式,这种语法也可以用于其他互斥的配置。例如,我们可以定义两个互斥的配置选项`optionA`和`optionB`,然后使用: ```qmake CONFIG(optionA, optionA|optionB) { # ... } CONFIG(optionB, optionA|optionB) { # ... } ``` ### 总结 `CONFIG(condition, scope)`语法是qmake中用于条件判断的一种形式,它允许我们限定条件的作用域,从而更精确地控制配置。特别适用于互斥的配置选项,如debug和release模式。 现在,根据用户的要求,我们生成相关问题: </think> ### qmake `CONFIG(condition, scope)` 语法详解 #### 一、基本语法结构 ```qmake CONFIG(condition, scope1|scope2|...) { # 当指定作用域内满足条件时执行的代码 } ``` #### 二、参数解析 1. **条件参数 (condition)** 需要检测的具体配置项,如: - `debug`:调试模式 - `release`:发布模式 - `static`:静态链接 - `qt`:包含Qt核心模块 2. **作用域参数 (scope)** 用竖线 `|` 分隔的限定作用域,如: - `debug|release`:仅在构建模式上下文中检测 - `static|shared`:在链接类型上下文中检测 - `win32|macx`:在操作系统上下文中检测 #### 三、典型使用场景 1. **构建模式区分**(引用[1][2]) ```qmake CONFIG(debug, debug|release) { DESTDIR = ./debug # 输出到debug目录 DEFINES += DEBUG_MODE # 定义调试宏 } CONFIG(release, debug|release) { DESTDIR = ./release # 输出到release目录 DEFINES += RELEASE_MODE # 定义发布宏 } ``` 2. **链接控制**(引用[2][4]) ```qmake CONFIG(static, static|shared) { LIBS += -lstaticlib # 静态链接 } CONFIG(shared, static|shared) { LIBS += -lsharedlib # 动态链接 } ``` #### 四、作用域限定机制 1. **作用域隔离原理** 当作用域参数为 `A|B` 时,仅当 `A` 或 `B` 在 `CONFIG` 中被显式激活时,才会检测条件参数: ```qmake # 仅当CONFIG包含debug或release时检测 CONFIG(qt, debug|release) { # 仅在构建模式上下文中检测qt配置 } ``` 2. **作用域优先级规则** ```qmake CONFIG += debug release CONFIG(debug, debug|release) { message("执行此处") # 优先匹配第一个有效作用域 } CONFIG(release, debug|release) { message("不执行此处") } ``` #### 五、与简单条件语句对比 | 语法形式 | 特点 | 示例 | |--------------------------|----------------------------------|--------------------------| | `CONFIG(debug)` | 全局检测debug配置 | 任何位置包含debug即触发 | | **`CONFIG(debug, debug|release)`** | 仅在构建模式上下文中检测 | 仅在debug/release作用域触发 | | `contains(CONFIG, debug)`| 功能等价于`CONFIG(debug)` | 复杂逻辑组合时使用 | #### 六、实际应用案例 1. **跨平台配置**(引用[4]) ```qmake # 仅在Linux平台且启用pkg-config时加载FFmpeg CONFIG(link_pkgconfig, unix|link_pkgconfig) { PKGCONFIG += libavcodec libavformat } ``` 2. **调试信息控制**(引用[1]) ```qmake CONFIG(debug, debug|release) { QMAKE_CXXFLAGS += -g -O0 # Debug编译选项 } ``` 3. **Qt模块动态加载** ```qmake CONFIG(qt, qt|no_qt) { QT += core gui # 仅当启用Qt时加载模块 } ``` #### 七、特殊场景处理 1. **多作用域嵌套** ```qmake CONFIG(win32, win32|macx) { # 操作系统作用域 CONFIG(debug, debug|release) { # 构建模式作用域 LIBS += -lwindbg # Windows调试专用 } } ``` 2. **作用域扩展技巧** ```qmake # 自定义作用域组合 scope = mobile|desktop CONFIG(touch, $$scope) { DEFINES += TOUCH_ENABLED } ``` > **关键总结**:该语法通过作用域限定(`scope1|scope2`)实现**精确条件检测**,避免配置冲突[^1][^2][^4],特别适用于互斥配置(如debug/release)的场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值