我正在使用 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 中手动执行此操作?
当我尝试使用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,我得到正确的路径列出到目标文件,Yes在Syms列中有一个.
什么可能出错的其他想法,以及如何解决它?
编辑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 …
如何--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族人也遇到了这个问题(错误报告),但我希望能够为我的项目解决此问题,而不是弄乱我的系统(除非我误解了此解决方案)。
我有一个由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等效的动态库?
我正在使用 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?
我正在编写一个库(使用 libtools),其中所有 API 文档都是使用 doxygen 完成的。
我想知道是否有一种简单的方法可以将生成的 doxygen 文档的安装集成到 autotools 中。
我认为构建文档应该很容易。但是一旦我运行 doxygen,将生成的(例如).html 文件放入 $(htmldir) 的正确方法是什么?
问题似乎是我不知道(我也不想知道)doxygen 将为我创建哪些文件,所以我无法真正将它们全部枚举到 html_DATA 中
我认为像“html_DATA=html/*.*”这样的东西是个坏主意
我在 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编译一个项目,但是当尝试在生成的可执行文件上运行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) 当我试图在cygwin中构建Apache Thrift源时,我收到的错误是"无法找到libtoolize!".如何在cygwin中安装libtoolize?
我正在 Mac 上构建一个项目。它以
glibtoolize: command not found.
Run Code Online (Sandbox Code Playgroud)
我没有找到安装 glibtool 和 glibtoolize 的任何说明。所有搜索结果都在讨论安装 libtool,我已经在我的 Mac 上安装了它。
有谁知道这是如何工作的?(我已经安装了 lated xcode,但我的系统中没有 glibtool。)