Makefile 中 -wl ,rpath 以及 O0 O1 O2 O3 Os 的用法

再makefile中一般默认的 lib 的加载路径是/lib /usr/lib  如果想要改变程序运行时的libs的加载路径 就需要用到 -wl , rpath 参数来添加lib 加载路径。


O0 O1 表示在不影响编译速率的前提下尽可能的优化程序的大小和运行速率。

O2  表示在牺牲部分编译速率的前提下 支持配置优化参数的优化 尽可能的提高运行速率。

O3  表示 采取多项量算法 提高程序的运行速率(他不惜增大程序的大小)

Os 和O3一样只不过他不会为了以为的提高程序运行速率二曾大程序的大小。

<think>我们正在处理一个关于g++链接选项的问题。用户提供了一组链接选项,并询问它们在生成`libqxcb-glx-integration.so`时的用法和作用。选项列表:`-Wl,--no-undefined-Wl,-O1-Wl,--enable-new-dtags-Wl,-z,origin-Wl,-rpath,$ORIGIN/../../lib-shared`注意:这些选项都是通过`-Wl,`传递给链接器(ld)的。`-Wl`是gcc/g++的选项,用于将逗号分隔的选项传递给链接器。我们将逐一解释每个选项的作用:1.`-Wl,--no-undefined`:传递给链接器的`--no-undefined`选项。这个选项要求链接器在链接时检查所有的符号引用是否都有定义。如果有未定义的符号,链接器会报错。这对于创建共享库时确保所有符号都能被解析非常重要,可以避免运行时出现未定义符号的错误。2.`-Wl,-O1`:传递给链接器的`-O1`选项。这是链接器的优化级别选项。`-O1`表示链接器会进行一些优化,例如合并相同的段(section)和重定位项,以及删除未使用的段。这可以减小输出文件的大小并提高运行时的性能。3.`-Wl,--enable-new-dtags`:传递给链接器的`--enable-new-dtags`选项。这个选项会同时设置动态节(dynamicsection)中的`DT_RPATH`和`DT_RUNPATH`标签。默认情况下,链接器只设置`DT_RPATH`。而`DT_RUNPATH`是较新的特性,其行为与`DT_RPATH`略有不同:在搜索共享库依赖时,`DT_RPATH`的搜索优先级高于`LD_LIBRARY_PATH`,而`DT_RUNPATH`的搜索优先级低于`LD_LIBRARY_PATH`。使用这个选项可以同时设置两者,但通常`DT_RUNPATH`会被使用(如果支持)。4.`-Wl,-z,origin`:传递给链接器的`-zorigin`选项。这个选项要求链接器将共享库标记为需要`$ORIGIN`处理。`$ORIGIN`是一个特殊的变量,代表可执行文件或共享库所在的目录。这个选项通常与`-rpath`选项一起使用,以允许使用`$ORIGIN`指定相对路径。5.`-Wl,-rpath,$ORIGIN/../../lib`:传递给链接器的`-rpath`选项,并指定路径`$ORIGIN/../../lib`。`-rpath`用于指定运行时搜索共享库的路径。这里使用`$ORIGIN`表示共享库所在目录,然后上两级目录(`../../`)再进入`lib`目录。这意味着运行时,该共享库会在这个相对路径下查找它所依赖的其他共享库。6.`-shared`:这是gcc/g++的选项(不是通过`-Wl`传递的),指示编译器生成共享库(动态链接库)而不是可执行文件。综合起来,这些选项的作用是:-创建一个共享库(`-shared`)。-要求所有符号在链接时都有定义(`--no-undefined`)。-进行链接时优化(`-O1`)。-同时设置`DT_RPATH`和`DT_RUNPATH`(`--enable-new-dtags`),以提供运行时库搜索路径。-允许使用`$ORIGIN`(`-zorigin`),这样在运行时可以解析相对路径。-设置运行时库搜索路径为相对于共享库位置的路径:`$ORIGIN/../../lib`(`-rpath,$ORIGIN/../../lib`)。这样生成的共享库`libqxcb-glx-integration.so`在运行时会在其所在目录的上两级目录下的`lib`目录中查找依赖的共享库。这对于将共享库和其依赖放在相对目录中非常有用,便于部署。注意:`$ORIGIN`在Linux系统中用于表示可执行文件或共享库的当前目录,但在命令行中直接使用`$ORIGIN`可能会被shell解释,因此通常需要在makefile或脚本中对其进行转义(例如写成`$$ORIGIN`)。在用户提供的例子中,我们看到了`$ORIGIN`,但在实际makefile中,可能需要写成`$$ORIGIN`以避免被make扩展。参考用户提供的引用[3]中提到了`-rpath`的用法,以及引用[2]中关于动态库依赖查找的问题(`ldd`显示`notfound`),使用`-rpath`可以解决运行时库的查找路径问题。因此,这个链接命令的作用就是创建一个共享库,并确保它在链接时没有未定义的符号,同时设置了运行时库的搜索路径(相对路径),以便在运行时能够正确加载依赖库。下面我们生成相关问题:</think>### g++ 链接选项解析 以下是生成 `libqxcb-glx-integration.so` 时使用的链接选项及其作用分析: ```bash -Wl,--no-undefined -Wl,-O1 -Wl,--enable-new-dtags -Wl,-z,origin -Wl,-rpath,$ORIGIN/../../lib -shared ``` #### 1. **`-Wl,--no-undefined`** - **作用**:强制检查所有符号是否被正确定义。如果存在未解析的符号引用,链接器会报错终止构建。 - **意义**:确保共享库的完整性,避免运行时因符号缺失导致崩溃。尤其适用于插件类动态库(如Qt的XCB插件)[^1][^3]。 #### 2. **`-Wl,-O1`** - **作用**:启用链接时优化(Level 1),包括: - 合并重复代码段(`.text`/`.data`) - 删除未使用的函数/变量 - 优化重定位表 - **意义**:减小生成的 `.so` 文件体积,提升加载效率(与编译优化选项互补)[^1]。 #### 3. **`-Wl,--enable-new-dtags`** - **作用**:在ELF文件中同时写入 `DT_RPATH` 和 `DT_RUNPATH` 动态标签。 - **意义**: - `DT_RPATH`:传统搜索路径(优先级高于 `LD_LIBRARY_PATH`) - `DT_RUNPATH`:新标准搜索路径(优先级低于 `LD_LIBRARY_PATH`) 双标签确保兼容不同运行时加载器行为[^4]。 #### 4. **`-Wl,-z,origin`** - **作用**:标记对象需要 `$ORIGIN` 路径解析支持。 - **意义**:允许在 `-rpath` 中使用 `$ORIGIN` 变量(表示当前库所在目录),为相对路径提供运行时解析基础[^4]。 #### 5. **`-Wl,-rpath,$ORIGIN/../../lib`** - **作用**:指定运行时库搜索路径: - `$ORIGIN`:当前库文件所在目录 - `$ORIGIN/../../lib`:从当前目录上溯两级后的 `lib` 子目录 - **意义**:避免依赖系统路径,实现自包含部署(如Qt插件定位主库文件)[^2][^3]。 #### 6. **`-shared`** - **作用**:指示生成共享库(`.so`)而非可执行文件。 - **意义**:核心编译选项,输出格式为动态链接库[^3]。 --- ### 典型使用场景 此选项组合常见于: 1. **Qt插件开发**(如XCB平台集成) ```makefile # Qt示例中的链接规则 libqxcb-glx-integration.so: $(OBJS) g++ -shared -Wl,--no-undefined -Wl,-O1 ... -o $@ ``` 2. **自包含部署** 通过 `$ORIGIN` 实现库文件在自定义目录结构的便携运行[^3]。 3. **严格符号检查** 确保插件与主程序二进制接口兼容(如Qt Gui模块)[^1][^5]。 --- ### 注意事项 1. **`$ORIGIN` 转义问题**: -Makefile中需写作 `$$ORIGIN`(如 `-Wl,-rpath,$$ORIGIN/../lib`) - Shell脚本中需写作 `\$ORIGIN` 2. **路径安全性**: `-z origin` 需配合 `-rpath` 使用,否则可能被安全策略拒绝(如SELinux的 `allow_execheap` 限制)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值