使用Autotools生成.so文件

5
我想使用Autotools创建一个.so文件,以便我可以使用dlsym加载它。我已经阅读了一些类似的主题,但没有一个建议的解决方案适用于我。这是我的内容:
我想将一个简单的hello.cpp编译成.so。
configure.ac
    AC_INIT(My Project, 0.1, my@email, myproject)
    AC_PREREQ(2.68)
    AC_COPYRIGHT(GNU General Public License)
    AM_CONFIG_HEADER([config.h])
    AC_PROG_CXX
    AM_INIT_AUTOMAKE([1.9 foreign])
    AC_CONFIG_FILES(Makefile)
    AC_ENABLE_SHARED
    AC_DISABLE_STATIC
    LT_INIT
    AC_OUTPUT

Makefile.am

    lib_LTLIBRARIES = libtest.la
    libtest_la_SOURCES = hello.cpp
    libtest_la_LDFLAGS = -version-info 0:0:0

我从这里得到了灵感,但是当我输入以下内容时:
    autoreconf -i
    ./configure
    make

我得到了一个libtest.la文件,但很遗憾没有.so文件。如果有帮助的话,这是我通常将hello.cpp编译成hello.so的方法:
    g++ -Wall -shared -rdynamic -fPIC hello.cpp -o hello.so

我希望有人能告诉我做错了什么,这样我就可以得到.so文件。
1个回答

5

我认为您需要在您的configure.ac中添加AM_PROG_LIBTOOL

AC_INIT(My Project, 0.1, my@email, myproject)
AC_PREREQ(2.68)
AC_COPYRIGHT(GNU General Public License)
AM_CONFIG_HEADER([config.h])

# I would add these three
AC_CONFIG_MACRO_DIR([m4])
AM_PROG_LIBTOOL
AC_PROG_INSTALL

AC_PROG_CXX
AM_INIT_AUTOMAKE([1.9 foreign])
AC_CONFIG_FILES(Makefile)
AC_ENABLE_SHARED
AC_DISABLE_STATIC
LT_INIT
AC_OUTPUT

如果这是一个插件(dlsym),请在您的Makefile.am中,使用我推荐的插件标志:
ACLOCAL_AMFLAGS = -I m4

lib_LTLIBRARIES = libtest.la
libtest_la_SOURCES = hello.cpp
libtest_la_LDFLAGS = -module -avoid-version -export-dynamic

这会为我生成一个*.so文件。

编辑:

我突然想到,你在哪里寻找你的*.so文件?它位于创建的.libs/子文件夹中(不要错过名称开头的.(它是隐藏的)):

ls -l .libs/
total 24K
-rw-rw-r-- 1 galik galik 2.6K Aug 22 10:00 hello.o
-rw-rw-r-- 1 galik galik 2.7K Aug 22 10:00 libtest.a
lrwxrwxrwx 1 galik galik   13 Aug 22 10:00 libtest.la -> ../libtest.la
-rw-rw-r-- 1 galik galik  908 Aug 22 10:00 libtest.lai
-rwxrwxr-x 1 galik galik 8.6K Aug 22 10:00 libtest.so*

我能否在另一个目录中生成.so文件? - bl618515
抱歉,我不知道是否可以在除了“.libs/”之外的其他目录中生成文件。 - Galik
好的,但对我来说仍然有效。我尝试了一个更复杂的插件,并使用dlsym打开了它。 - bl618515
谢谢!附言,有没有非libtool工具可以使用autoconf制作so文件?我在GNU手册中找不到任何不是以libtool为中心的内容。也许除了so文件之外,生成la文件是无害的,但显然我不知道。 - ThorSummoner
@ThorSummoner 很抱歉,我不知道如何在autotools中构建.so文件而不使用libtool - Galik

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