如何在构建时修改

如何在构建时修改

本文介绍了如何在构建时修改 .dylib 的安装名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为 Mac OS 上的 C++ 构建 google-gflags 命令行标志库X (10.7.1).构建过程如下:

$ ./configure --prefix=output$ make$ 安装

我想在构建时更改生成的共享库的安装名称,之后不使用 install_name_tool.

默认情况下,生成的共享库的安装名libgflags.dylib,就是输出路径:

$ otool -L ./output/libgflags.dylib$ ./output/libgflags.dylib:/tmp/gflags-1.5/output/lib/libgflags.0.dylib(兼容版本2.0.0,当前版本2.0.0)/usr/lib/libstdc++.6.dylib(兼容版本 7.0.0,当前版本 52.0.0)/usr/lib/libSystem.B.dylib(兼容版本 1.0.0,当前版本 159.0.0)

ld(1) 的手册页有一个 -install_name 选项,可用于在链接时更改动态库的安装名称.>

例如,使用一个虚拟程序:

$ g++ -dynamiclib temp.cc -install_name/tmp/temp.dylib -o temp.dylib$ otool -L temp.dylib临时库:/tmp/temp.dylib(兼容版本 0.0.0,当前版本 0.0.0)/usr/lib/libstdc++.6.dylib(兼容版本 7.0.0,当前版本 52.0.0)/usr/lib/libSystem.B.dylib(兼容版本 1.0.0,当前版本 159.0.0)

但是,我无法将此命令行选项与 ./configure 脚本一起使用.我试过手动设置 CFLAGS 变量,但这会导致错误:

$ CFLAGS="-install_name/tmp/desired/location/libgflags.dylib" ./configure检查 BSD 兼容的安装.../opt/local/bin/ginstall -c检查构建环境是否正常......是的检查目瞪口呆……不检查mawk...不检查 nawk... 不检查 awk... awk检查 make 是否设置 $(MAKE)... 是检查 gcc ... gcc检查 C 编译器是否工作...否配置:错误:在`/Users/vibhav/Code/install_name_test/gflags-1.5'中:配置:错误:C 编译器无法创建可执行文件

那么,我是否可以在不使用install_name_tool的情况下更改由configuremake生成的.dylib的安装名称?>

解决方案

通常,通过 g++ 传递链接器参数必须以 -Wl 开头,空格必须用逗号替换.因此,如果您想将-install_name/tmp/temp.dylib"传递给链接器,您需要调用它:

g++ -Wl,-install_name,/tmp/temp.dylib ...

I am building the google-gflags commandline flags library for C++ on Mac OS X (10.7.1). The build process is as such:

$ ./configure --prefix=output
$ make
$ make install

I'd like to change the install name of the generated shared library at build time and not use install_name_tool afterwards.

By default, the install name of the generated shared library, libgflags.dylib, is the output path:

$ otool -L ./output/libgflags.dylib
$ ./output/libgflags.dylib:
    /tmp/gflags-1.5/output/lib/libgflags.0.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

The man page for ld(1) has a -install_name option which can be used to change the install name of a dynamic library at link-time.

For example, with a dummy program:

$ g++ -dynamiclib temp.cc -install_name /tmp/temp.dylib -o temp.dylib
$ otool -L temp.dylib
temp.dylib:
    /tmp/temp.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

But, I am unable to use this command line option with the ./configure script. I've tried manually setting the CFLAGS variable, but that results in a error:

$ CFLAGS="-install_name /tmp/desired/location/libgflags.dylib" ./configure
checking for a BSD-compatible install... /opt/local/bin/ginstall -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/Users/vibhav/Code/install_name_test/gflags-1.5':
configure: error: C compiler cannot create executables

So, is it possible for me to change the install name of .dylib generated by configure and make without using install_name_tool?

解决方案

Generally, passing linker arguments through g++ must be prefaced with -Wl and spaces must be replaced with commas. So, if you want to pass "-install_name /tmp/temp.dylib" to the linker you will need to call this:

g++ -Wl,-install_name,/tmp/temp.dylib ...

这篇关于如何在构建时修改 .dylib 的安装名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 11:50