当前位置: 首页 > 知识库问答 >
问题:

c++ - 编译 icu 时如何制定依赖库路径?

商品
2024-10-09
./configure --prefix=/Applications/xxx/lib/_icu74.2 --disable-samples --disable-tests --enable-static --with-library-bits=64

make && make install

然后

otool -L '/Applications/xx/lib/_icu74.2/lib/libicudata.74.2.dylib'

结果为

libicudata.74.dylib (compatibility version 74.0.0, current version 74.2.0)

可以看到这里的链接库引用地址为相对路径,在编译的时候是否可以用参数指定或者修改 makefile 文件之类的方法来让其修改为引用绝对路径?

共有1个答案

葛越泽
2024-10-09

在编译 ICU(International Components for Unicode)时,默认情况下,动态库(如 .dylib 文件在 macOS 上)的链接路径通常是相对路径,这是因为 ICU 的配置和构建系统默认使用这种方式来管理库文件的位置。如果你希望修改这些库文件以使用绝对路径,你可以通过几种方式来实现:

1. 修改 install_name_tool

最直接的方法是使用 install_name_tool 来修改已经安装好的库文件的依赖路径。在 make install 之后,你可以使用以下命令来改变库文件的链接路径:

sudo install_name_tool -change @rpath/libicudata.74.dylib /Applications/xxx/lib/_icu74.2/lib/libicudata.74.dylib /Applications/xx/lib/_icu74.2/lib/libicudata.74.2.dylib

注意:上面的命令假设 @rpath/libicudata.74.dylib 是你需要更改的依赖路径(这取决于你的实际构建输出)。你可能需要先运行 otool -L 来确认实际的依赖路径。

2. 使用 LDFLAGSCPPFLAGS

在编译过程中,你可以通过设置 LDFLAGSCPPFLAGS 环境变量来指定额外的链接和预处理选项。然而,这些变量通常用于指定额外的库路径或定义宏,而不是直接修改链接后的动态库路径。但是,它们可以帮助确保在编译时找到正确的库文件。

3. 修改 Makefile 或构建脚本

如果你熟悉 ICU 的构建系统,你可以尝试修改 Makefile 或相关的构建脚本来改变库文件的链接路径。这通常涉及到修改 LDFLAGS 变量,使其包含 -Wl,-rpath,/path/to/libraries 选项,但这通常只影响运行时库的搜索路径,而不是库文件中的实际链接路径。

4. 使用 rpath

在链接时,你可以使用 -Wl,-rpath,/absolute/path/to/libraries 选项来设置运行时库的搜索路径。这可以通过在 configure 脚本中设置 LDFLAGS 或在 Makefile 中修改链接命令来实现。然而,这并不会改变库文件中记录的路径,但会影响运行时库文件的搜索。

结论

改变已安装动态库文件的链接路径通常是通过 install_name_tool 完成的。其他方法,如修改 Makefile 或使用 rpath,通常用于控制运行时库的搜索路径,而不是直接修改库文件中的链接路径。如果你需要在多个位置部署 ICU,并且希望保持链接路径的一致性,考虑使用相对路径或符号链接可能是更好的选择。

 类似资料:
  • 目前,我正在尝试使用FCM,但在编译依赖文件时遇到了一个问题。它给出了一个错误,如Under Gradle(模块:app): 错误 请告诉我它无法成功编译的原因。

  • 我正在使用mongodb和Spring Boot。最近,我的mongodb升级到了3.0版本。 我对Spring使用以下Gradle依赖项: 如果我查看maven存储库中的gradle:,我会看到以下内容(http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb/1.2.6

  • 问题内容: 我了解运行时和编译时之间的区别以及如何区分两者,但是我只是看不到需要区分编译时和运行时 依赖项 。 我正在cho的是:程序如何在运行时 不依赖 编译期间 依赖 的东西?如果我的Java应用程序使用log4j,则它需要log4j.jar文件才能进行编译(我的代码与log4j集成并从其中调用成员方法)以及运行时(我的代码绝对无法控制log4j内的代码一旦发生了什么.jar已运行)。 我正在

  • 我正在学习OSGi框架。我发现捆绑包由。类文件和清单文件。现在假设我有两个包A和B,包B依赖于包A的服务。因此,在编译bundle B时,我必须将Bundle A的服务类保存在bundle B的类路径中,或者必须将它(Bundle A的服务)保存在bundle B中,以便编译器可以编译。现在,如果我们这样做,那么模块化是如何实现的,以及这两个包是如何独立的。请帮帮忙。谢谢

  • 问题内容: 是否可以在Gradle(在Android Studio中)中指定对当前项目边界之外的另一个gradle项目的依赖关系?例如,相对路径如下所示: 所以我想的是这样的: 我有一个Android应用程序。结构如下: MyApp(路径为/ Users / foo / workspace / MyApp) 应用程序(路径为/ Users / foo / workspace / MyApp / a