您如何强制 automake 将共享对象复制到 /usr/local/lib?
How do you force automake to copy shared objects to /usr/local/lib?
我目前有一个依赖于某些外部共享对象 (.so) 的 C++ 项目。我的当前目录如下所示:
├── 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,-rpath,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
您可以看到我正在使用 link 标志 -L lib/fmod/---- -library linking 每个库。最初,我的 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,--no-as-needed,-rpath,lib/fmod/core,-rpath,lib/fmod/studio
因为我们正在 linking 到我们的 lib 文件的 rpath,程序没有问题 运行ning。但是,如果我 运行 make install,被 linked 的 rpath 将是 /usr/bin/lib/fmod/core 和 /usr/bin /lib/fmod/studio,显然没有所需的文件。我的 .so 文件仍然没有被复制到任何地方。我想将我的 .so 文件直接复制到 /usr/local/lib,这样我的程序就可以 运行 而不必直接 link 它。
如何强制 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 中,其中 /usr/local/lib 在 /etc/ld.so.conf.d 上不是默认的,因此 [=24= 上的库] 未使用。
为了解决这个问题,我在 makefile.am
中添加了以下行
install-data-hook:
ldconfig $(prefix)/lib
这会创建一个挂钩,在 lib 文件已添加到 $(prefix)/lib 之后 运行s,当 运行 时,它将文件夹添加到 /etc/ld。 so.conf.d,所以现在 make install 之后,一切都 运行 很顺利。
我目前有一个依赖于某些外部共享对象 (.so) 的 C++ 项目。我的当前目录如下所示:
├── 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,-rpath,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
您可以看到我正在使用 link 标志 -L lib/fmod/---- -library linking 每个库。最初,我的 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,--no-as-needed,-rpath,lib/fmod/core,-rpath,lib/fmod/studio
因为我们正在 linking 到我们的 lib 文件的 rpath,程序没有问题 运行ning。但是,如果我 运行 make install,被 linked 的 rpath 将是 /usr/bin/lib/fmod/core 和 /usr/bin /lib/fmod/studio,显然没有所需的文件。我的 .so 文件仍然没有被复制到任何地方。我想将我的 .so 文件直接复制到 /usr/local/lib,这样我的程序就可以 运行 而不必直接 link 它。
如何强制 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 中,其中 /usr/local/lib 在 /etc/ld.so.conf.d 上不是默认的,因此 [=24= 上的库] 未使用。
为了解决这个问题,我在 makefile.am
中添加了以下行install-data-hook:
ldconfig $(prefix)/lib
这会创建一个挂钩,在 lib 文件已添加到 $(prefix)/lib 之后 运行s,当 运行 时,它将文件夹添加到 /etc/ld。 so.conf.d,所以现在 make install 之后,一切都 运行 很顺利。