c++ - 使用 Autotools 生成 .so 文件

标签 c++ makefile autotools shared-libraries

我想使用 Autotools 创建一个 .so 文件,以便我可以使用 dlsym 加载它。我读过一些类似的主题,但没有一个建议的解决方案对我有用。这是我所拥有的:

我想将一个简单的 hello.cpp 编译成 .so。

配置文件

    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

生成文件.am

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

我从 here 得到这个想法,但是当我输入:

    autoreconf -i
    ./configure
    make

我得到一个 libtest.la 文件,但遗憾的是没有 .so 文件。如果有帮助,这就是我通常将 hello.cpp 编译成 hello.so 的方式:

    g++ -Wall -shared -rdynamic -fPIC hello.cpp -o hello.so

如果有人告诉我我做错了什么,我将不胜感激,以便我最终得到 .so 文件。

最佳答案

我认为您需要将 AM_PROG_LIBTOOL 添加到您的 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])

# 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

如果这是一个插件,也在你的 Makefile.am 中吗? (dlsym) 然后我给出了为插件推荐的标志:

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*

关于c++ - 使用 Autotools 生成 .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25442903/

相关文章:

macos - 如何在 Makefile (-c -g) 中使用分离的编译/链接过程在 gcc/clang 中生成调试信息?

堆或堆栈上的 C++ vector ?

c# - Unity 是否将脚本编译为 C++?

c++ - QMenuBar 不使用原生样式? C++,QT设计器。用户界面

c - 在 C99 中使用检查单元测试框架时出现语法错误

c++ - 如何将 gprof 与 autotools 一起使用?

autotools - 如何在 autoconf :configure. ac 中使用字符串变量

c++ - MFC:为什么会发生这种堆损坏? (array_s.cpp/afxcoll.inl)

makefile - nmake 附加到变量

c - 尽管使用了 -I 选项,但未找到 header