标签: libtool

autoconf set -fPIC 仅在必要时

我正在使用 autoconf/libtool 编写一个共享库,我想为 Linux 和 Windows 编译它(使用 mingw 交叉编译器)。对于 Linux(可能还有其他支持它的平台),我需要设置 -fPIC。所以我把它放到了 Makefile.am 的 CFLAGS 中。但是当我用 mingw 交叉编译它时,gcc 会发出警告:

warning: -fPIC ignored for target (all code is position independent)
Run Code Online (Sandbox Code Playgroud)

因此,显然 Windows 代码不需要此选项。这只是一个警告,但无论如何我都想摆脱它。我怎样才能做到这一点?也许已经有一个 libtool/autoconf 功能可以检查该选项是否受支持并且仅在需要时才设置它,所以我不必在 Makefile.am 中手动执行此操作?

c mingw shared-libraries libtool

4
推荐指数
1
解决办法
2698
查看次数

缺少整个程序中库的调试符号的行号,但不是单独的

当我尝试使用gdb来调试使用libtool构建的包的测试程序时,我发现了一个奇怪的问题.如果我运行libtool --mode=execute gdb .libs/libfoo.so并要求它列出某些函数list Bar::Baz的源代码,我会按预期获得源代码.如果我运行libtool --mode=execute gdb binary,我可以闯入Bar::Baz(),并在堆栈跟踪中查看其参数,但我没有得到源文件或行号,如下所示:

#7  0x018348e5 in Bar::Baz(Qux*, Quux*) () from /path/to/libfoo.so
                           ^^^^^^^^^^^ <--- debug symbols are present!
Run Code Online (Sandbox Code Playgroud)

同样,如果我list Bar::Baz在调试可执行文件时尝试,我会得到

No line number known for 'Bar::Baz'.
Run Code Online (Sandbox Code Playgroud)

我已经确认二进制文件是链接的-g,我可以列出它的main功能,所以我知道存在一些调试信息.

当我说info sources,我得到了构建库的文件的完整列表,具有正确的绝对路径.当我说info shared,我得到正确的路径列出到目标文件,YesSyms列中有一个.

什么可能出错的其他想法,以及如何解决它?


编辑1:偶然地,我objdump -g在违规库上运行,并得到以下输出:

/path/to/foo.so.0.0.0: file format elf32-i386
objdump: /path/to/foo.so.0.0.0: no recognized debugging information
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的,因为objdump -h(我试图运行)列出了一堆.debug_*部分.该objdump手册也表明readelf …

gdb debug-symbols libtool dwarf

4
推荐指数
2
解决办法
7824
查看次数

如何将共享库与-根据automake的需要链接?

如何--as-needed使用Automake 链接共享库?当我尝试将标志添加到时LDFLAGS,我看到这样libtool调用:

/bin/bash ../../libtool --mode=link ... -Wl,--as-needed ... dependencies
Run Code Online (Sandbox Code Playgroud)

这样会导致呼叫GCC,如下所示:

gcc -shared ... dependencies ... -Wl,--as-needed ...
Run Code Online (Sandbox Code Playgroud)

但这是错误的顺序。

  • 有没有办法用Libtool做到这一点?

  • 还是有一种使用Automake而不使用Libtool构建共享库的好方法?(过去,由于各种其他原因,我对Libtool感到沮丧...)

似乎Debian族人也遇到了这个问题(错误报告),但我希望能够为我的项目解决此问题,而不是弄乱我的系统(除非我误解了此解决方案)。

linker automake libtool

4
推荐指数
1
解决办法
1309
查看次数

如何强制测试程序链接到libtool构建的静态库

我有一个由autotools管理的库.我有以下几行Makefile.am,以及其他必要的配置

lib_LTLIBRARIES = libstuff.la
Run Code Online (Sandbox Code Playgroud)

我的项目还构建了一个程序来运行一些测试套件.该程序配置如下:

noinst_PROGRAMS = runtests
runtests_SOURCES = test/stuff.c stuff.h
runtests_LDADD = libstuff.la
Run Code Online (Sandbox Code Playgroud)

但是,程序始终链接到动态版本libstuff.la,这会使某些情况复杂化(例如,调试gdb).我怎么能强制程序链接libstuff.a而不是libstuff.so等效的动态库?

c autotools libtool static-linking

4
推荐指数
1
解决办法
2214
查看次数

在 libtool 命令行上重复库

我正在使用 automake,并获得这样的 libtool 调用:

/bin/sh ../libtool --tag=CC --mode=link gcc -o test_foo test_foo.o -lA -lB -lC -lA -lB -lC
Run Code Online (Sandbox Code Playgroud)

请注意,库(超出我的控制范围)具有循环依赖关系,需要多次提及它们。不幸的是,似乎 libtool 将对库的多个请求合并为一个请求,并且它运行:

gcc -o test_foo test_foo.o -lA -lB -lC
Run Code Online (Sandbox Code Playgroud)

请注意,对 libs 的第二次传递消失了;我收到一堆链接器错误。当我手动运行带有额外-l标志的gcc 命令行时,它可以工作。

如何让 libtool 将我请求的所有库传递给 gcc?

linker automake libtool

4
推荐指数
1
解决办法
727
查看次数

使用 autotools 生成(并安装)doxygen 文档

我正在编写一个库(使用 libtools),其中所有 API 文档都是使用 doxygen 完成的。

我想知道是否有一种简单的方法可以将生成的 doxygen 文档的安装集成到 autotools 中。

我认为构建文档应该很容易。但是一旦我运行 doxygen,将生成的(例如).html 文件放入 $(htmldir) 的正确方法是什么?

问题似乎是我不知道(我也不想知道)doxygen 将为我创建哪些文件,所以我无法真正将它们全部枚举到 html_DATA 中

我认为像“html_DATA=html/*.*”这样的东西是个主意

doxygen autotools libtool

4
推荐指数
1
解决办法
2624
查看次数

libtool 不提供要链接的库依赖项

我在 ubuntu lucid 上使用 libtool 2.2.6b,在 ubuntu precision 上使用 libtool 2.4.2。清醒时,我的项目将正确链接。准确地说,它无法链接。这是演示我的问题的示例代码;

配置文件

AC_INIT([ltp], [0.0.1], [someone])
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([.m4])
AC_CONFIG_FILES([Makefile foo/Makefile bar/Makefile wah/Makefile])
AC_PROG_CXX
AC_PROG_LIBTOOL
AM_SANITY_CHECK
AC_LANG_CPLUSPLUS
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)

生成文件

SUBDIRS = foo bar wah
ACLOCAL_AMFLAGS = -I .m4
Run Code Online (Sandbox Code Playgroud)

foo/foo.h

#ifndef FOO_FOO_H_
#define FOO_FOO_H_
namespace Foo
{
  class Foo
  {
  public:
    Foo(long l);
  private:
    long l;
  };
}
#endif
Run Code Online (Sandbox Code Playgroud)

foo/foo.cpp

#include "foo/Foo.h"
namespace Foo
{
  Foo::Foo(long l) : l(l) {}
}
Run Code Online (Sandbox Code Playgroud)

foo/Makefile.am

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = Foo.cpp
libfoo_la_CPPFLAGS =
libfoo_la_LDFLAGS = …
Run Code Online (Sandbox Code Playgroud)

automake libtool

4
推荐指数
1
解决办法
3508
查看次数

在使用autotools编译的项目上运行valgrind会输出多个堆摘要

我正在使用automake编译一个项目,但是当尝试在生成的可执行文件上运行valgrind时,它没有按预期运行,在实际执行我要检查的代码之前似乎运行了8次,并且该部分的堆摘要代码根本不显示:

==4601== Memcheck, a memory error detector
==4601== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.                                                                                            
==4601== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info                                                                                          
==4601== Command: ./launcher -g ../data/params.txt                                                                                                                  
==4601==                                                                                                                                                            
==4605==                                                                                                                                                            
==4605== HEAP SUMMARY:                                                                                                                                              
==4605==     in use at exit: 0 bytes in 0 blocks                                                                                                                    
==4605==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated                                                                                                   
==4605==                                                                                                                                                            
==4605== All heap blocks were freed -- no leaks are possible                                                                                                        
==4605==                                                                                                                                                            
==4605== For counts of detected and …
Run Code Online (Sandbox Code Playgroud)

c automake valgrind autotools libtool

4
推荐指数
1
解决办法
965
查看次数

如何在cygwin中安装libtoolize?

当我试图在cygwin中构建Apache Thrift源时,我收到的错误是"无法找到libtoolize!".如何在cygwin中安装libtoolize?

windows cygwin libtool

4
推荐指数
2
解决办法
4880
查看次数

MacBook 上的 glibtool

我正在 Mac 上构建一个项目。它以

glibtoolize: command not found.
Run Code Online (Sandbox Code Playgroud)

我没有找到安装 glibtool 和 glibtoolize 的任何说明。所有搜索结果都在讨论安装 libtool,我已经在我的 Mac 上安装了它。

有谁知道这是如何工作的?(我已经安装了 lated xcode,但我的系统中没有 glibtool。)

macos xcode libtool

4
推荐指数
1
解决办法
2524
查看次数