微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您如何强制 automake 将共享对象复制到 /usr/local/lib?

如何解决您如何强制 automake 将共享对象复制到 /usr/local/lib?

我目前有一个 C++ 项目,它依赖于一些外部共享对象 (.so)。我的当前目录如下所示:

├── src
│   └── .cpp files
├── include
│   ├── glad
│   │   └── .h files 
│   └── fmod
│       ├── core
│       │    └── .h files 
│       └── studio
│           └── .h files 
├── lib
│   └── fmod
│       ├── core
│       │   └── .so files 
│       └── studio
│           └── .so files 
├── Makefile.am
├── configure.ac

我想编译这个项目,同时将那些 .so 文件复制到 /usr/lib 或 /usr/local/lib,但是我似乎无法做到这一点!

以下是我的configure.ac文件

AC_INIT([autoGL],1.0)
AM_INIT_AUTomake
AC_PROG_CC
AC_PROG_CXX
AC_CONfig_FILES(Makefile)
AC_OUTPUT

还有我的 Makefile.am

bin_PROGRAMS = autogl
autogl_SOURCES = src/Source.cpp
autogl_SOURCES+= src/glad.c
autogl_LDADD = -lglfw -ldl
autogl_LDADD+= -L lib/fmod/core -lfmod
autogl_LDADD+= -L lib/fmod/studio -lfmodstudio
autogl_LDFLAGS = -Wl,--no-as-needed,-rpath,lib/fmod/core,lib/fmod/studio
autogl_CPPFLAGS = -I include
autogl_CPPFLAGS+= -I include/fmod/core
autogl_CPPFLAGS+= -I include/fmod/studio
autogl_CPPFLAGS+= -I include/fmod/fsbank

您可以看到我正在使用链接标志 -L lib/fmod/---- -library 链接每个库。最初,我的 Makefile.am 的第七行只有

autogl_LDFLAGS = -Wl,--no-as-needed

产生以下g++代码,成功并给了我一个可执行文件

g++  -g -O2 -Wl,--no-as-needed   -o autogl autogl-Source.o autogl-glad.o -lglfw -ldl -L lib/fmod/core -lfmod -L lib/fmod/studio/ -lfmodstudio

但是,当尝试运行它时,我会收到以下错误

./autogl: error while loading shared libraries: libfmod.so.12: cannot open shared object file: No such file or directory

我的共享对象没有被复制到 /usr/lib 或 /usr/local/lib。

加上

autogl_LDFLAGS = -Wl,lib/fmod/studio

由于我们将 rpath 链接到我们的 lib 文件,因此程序运行没有问题。但是,如果我运行 make install链接的 rpath 将是 /usr/bin/lib/fmod/core 和 /usr/bin/lib/fmod/studio,它们显然没有需要的文件。我的 .so 文件仍然没有被复制到任何地方。我想将我的 .so 文件直接复制到 /usr/local/lib 以便我的程序可以运行而无需我直接链接它。

如何强制 automake 将这些 .so 文件直接复制到我选择的文件夹中? (最好是 /usr/local/lib)。

解决方法

找到了解决方案!

Autotools 还提供了传输数据的可能性。我将以下内容添加到我的 Makefile.am

flashdir=$(prefix)/lib
flash_DATA= lib/fmod/core/libfmodL.so \
          lib/fmod/core/libfmodL.so.12 \
          lib/fmod/core/libfmodL.so.12.10 
          .....

这会将我所有的 .so 文件添加到 $(prefix)/lib,通常是 /usr/local/lib。

然而,有一个问题,尤其是在 Ubuntu 中,/etc/ld.so.conf.d 上的 /usr/local/lib 不是默认的,所以 /usr/local/lib 上的库没有被使用。

为了解决这个问题,我在 makefile.am 中添加了以下行

install-data-hook:
    ldconfig $(prefix)/lib

这会创建一个钩子,它在 lib 文件已经添加到 $(prefix)/lib 之后运行,当运行时,将文件夹添加到 /etc/ld.so.conf.d,所以现在在 make install 之后,一切顺利。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。