如何在自动化 Make 脚本中创建共享库 (.so)?

28

给定一个源文件test.cpp,我想创建一个共享库libtest.so。我正在尝试在 automake 文件的范围内完成此操作,但似乎无法使其正常工作。

例如,在 g++ 下,我执行以下操作:

g++ -shared -fPIC test.cpp -o libtest.so

那么我可以创建另一个文件,其依赖于共享库,如下所示:

g++ mytest.cpp libtest.so -o blah

我已经阅读过,只有通过libtool automake才支持创建共享库。我尝试按照以下方式让我的automake脚本工作,但它似乎从未生成.so文件。我最接近的尝试是生成.la和.o文件:

在configure.ac中:

AC_ENABLE_SHARED
AC_DISABLE_STATIC
AC_PROG_LIBTOOL(libtool)

在Makefile.am文件中

lib_LTLIBRARIES=libtest.la
libtest_la_SOURCES=test.cpp
libtest_la_CFLAGS=-fPIC
libtest_la_CPPFLAGS=-fPIC
libtest_la_CXXFLAGS=-fPIC
libtest_la_LDFLAGS= -shared -fPIC

有人可以给我一个基于上述内容构建 .so 的示例吗?


1
你应该将 AC_PROG_LIBTOOL 替换为 LT_INIT。 - William Pursell
3
写完这段之后,我发现上述命令确实会在源代码目录下的隐藏 .libs 目录中生成 .so 文件。希望这可以帮助其他人解决类似的问题。 - skimon
3
谁能在这里发布完整的文件示例?不是源文件,而是configure.ac和Makefile.am。我无法使用本主题中的信息使其工作。 - Thomas Nyberg
1个回答

24
如果你只是在 configure.ac 和 Makefile.am 中加入 LT_INIT,则需要执行以下操作:
lib_LTLIBRARIES = libtest.la
libtest_la_SOURCES = test.cpp
libtest_la_LDFLAGS = -version-info 0:0:0
这样应该会得到一个 .so 文件,不需要在 CFLAGS 等中指定 -fPIC。-version-info 指示符不是必需的,但是是个好主意。

如果它是用于测试而不是安装,那么它不应该是check_LTLIBRARIES吗? - Jack Kelly
@Jack,check_LTLIBRARIES不会构建.so文件!我认为问题中的“test”并不是指与check_前缀所示相同类型的测试。 - William Pursell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接