对于那些从源代码编译过来的人来说,知道运行"./configure"只是为了找到那个X库还是丢失了多少痛苦,最糟糕的是它吐出了一条愚蠢的行,说缺少一个神秘的lib文件,你就可以了必须转到丢失文件中的网络浏览器类型,谷歌可以为您找到答案...
我觉得这很重复,所以我的问题是:
有没有办法解决所有必需的依赖项,但没有做"./configure"
我一直在玩OpenCV,并希望继续使用它,但我不能再和cmake一起生活了.是否有人知道将cmake构建描述转换为autotools的工具?
编辑:我希望不要把它变成另一场火焰战,但我想这是不可避免的,所以我只会说我有更多的autotools经验,并且不想学习cmake(或scons或imake或ant,虽然我似乎这些天使用Java时,或者明年或之后发明的任何新工具,几乎都坚持使用后者.在发明一个新工具之前,我可以发现关于学习当前工具如何以及为什么工作的惯常咆哮,但我宁愿请求和平共存:autotools和cmake不能在同一个项目中相处吗?这样我就能以对我有意义的方式做事,而其他人也可以这样做.在两者之间自动翻译的方法将使用户和维护者的生活更加轻松.
我正在使用一些autoconf的东西,并且测试包括以下内容:
static int test_array [1 - 2 * !((((float)((int)((float)1.4))) == ((float)1.4)) >= 0)];
Run Code Online (Sandbox Code Playgroud)
这失败了:
错误:'test_array'的存储大小不是常量
但当我改为:
static int test_array [1 - 2 * !((((int)((int)((int)1.4))) == ((int)1.4)) >= 0)];
Run Code Online (Sandbox Code Playgroud)
它工作正常.
我对autotools使用的所有hack都不是很熟悉,但这两个看起来似乎在编译时应该可以确定值.
为什么第一个失败?
我发现一个makefile 这里一边念叨自动工具.
我从来没有使用像这样的makefile,我自己尝试过.
我写的makefile的内容是:
all: HelloWorld
clean:
rm -f HelloWorld *.o
Run Code Online (Sandbox Code Playgroud)
包含makefile的文件夹只包含一个文件HelloWorld.c.
make以下输出成功运行:
$> make
cc HelloWorld.c -o HelloWorld
Run Code Online (Sandbox Code Playgroud)
现在,我想尝试,并在makefile我改名为目标all来HelloWorl.这次make失败并出现以下错误:
$> make
make: *** No rule to make target `HelloWorl', needed by `all'. Stop.
Run Code Online (Sandbox Code Playgroud)
请解释make自动搜索和编译源的这种行为.
我的理解是它通过附加.c并使用默认cc编译器编译来从目标名称创建源名称.
要查看我要执行的操作,请参见以下内容:
我的问题是如何在我的Makefile.am中有条件地设置AM_CPPFLAGS或my_lib_la_CPPFLAGS。这样在运行configure时是否设置了正确的CPPFLAGS?
目前,我正在做一些影响以下方面的事情:
lib_xml_wrapper_la_CPPFLAGS = -I../../
UNAME_S = $(shell uname -s)
UNAME_P = $(shell uname -p)
ifeq ($(UNAME_S),Linux)
lib_xml_wrapper_la_CPPFLAGS += -DLINUX
ifeq ($(UNAME_P),x86_64)
lib_xml_wrapper_la_CPPFLAGS += -D AMD64
endif
ifeq ($(UNAME_P),x86_64)
lib_xml_wrapper_la_CPPFLAGS += -I../../../external/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include/
endif
ifneq ($(filter %86,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS += -I../../../external/xerces-c-3.1.1-x86-linux-gcc-3.4/include/
endif
ifneq ($(filter arm%,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS +=
endif
endif
ifeq ($(UNAME_S),Darwin)
lib_xml_wrapper_la_CPPFLAGS += -DOSX
ifneq ($(filter %86,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS += -I../../../external/xerces-c-3.1.1-x86-macosx-gcc-3.4/include/
endif
ifneq ($(filter arm%,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS +=
endif
endif
Run Code Online (Sandbox Code Playgroud)
这似乎在Makefile.am中不起作用。我收到以下错误:
xml_wrapper/Makefile.am:26: error: endif without if
xml_wrapper/Makefile.am:35: error: endif without if
automake: warnings …Run Code Online (Sandbox Code Playgroud) 如何正确定位libstdc++.so.*用于编译 autotools 项目,以便将其与发行版捆绑在一起?
在我们团队切换到 C++11 后,我们需要将新的 libstdc++.so.6 与我们软件的每个发行版捆绑在一起,但是如何正确找到该库?
/lib/gcc/x86_64-pc-cygwin/5.2.0/usr/lib64/usr/local/gcc-5.2.0/lib64我已经尝试过:
install-exec-local:
cp $(shell dirname $(shell which ${CXX}))/../lib64/libstdc++.so.6 ${prefix}/lib
Run Code Online (Sandbox Code Playgroud)
(而不是make dist,我们make install进入一个配置的前缀然后捆绑前缀)
这有效,但不适用于 Cygwin,我不确定它是否适用于其他平台,因此我的问题。
有关与软件捆绑的基本原理,请参阅此问题libstdc++.so。它运作良好。我们还使用dlopen加载.so依赖的 s,libstdc++.so因此静态链接比听起来更难。
唯一的问题是定位libstdc++.so.6在make dist时间(或我们的等价物),让我可以cp它为我们分发的${prefix}/lib目录,前焦油gzip压缩,并将其提供给客户。理想情况下,我正在寻找类似g++ --print-path-to-libstdc++.so.
运行软件的目标系统有一个较旧 libstdc++.so的 .
我想在C预处理器样式中传递一个常量,但是使用Python脚本.
这个常量已经AC_DEFINE在我的configure.ac文件中声明并在我的C程序中使用,现在我也需要将它传递给Python脚本.
我试图用我的一个自定义的目标Makefile.am与sed预处理呼叫我的Python脚本特定符号,但它似乎肮脏的编码给我.
我怎样才能做到这一点?
所以,我正在努力将一个非常古老的configure.in变成现代的configure.ac,但我遇到了一些绊脚石。
我试图AS_IF根据PKG_CHECK_MODULESand的结果使用语句来做 1-3 件事AC_ARG_ENABLE,但我似乎无法将它们强制到AS_IFaction-if-true 插槽中。
我目前的设置如下:
# Check for libbar
PKG_CHECK_MODULES([BAR],[bar],[bar_found=yes],[bar_found=no])
AC_ARG_ENABLE([bar],
AS_HELP_STRING([--enable-bar],[enable support for bar [default=yes]]))
AS_IF([test x$enable_bar = xyes],
[AS_IF(
[test x$bar_found = xyes],
[AC_DEFINE([HAVE_BAR_SUPPORT],[1],[Define if bar support is enabled])],
[AC_MSG_ERROR([*** bar requested but not found ***])])
]
)
AS_IF([test x$enable_bar = xyes],
[AS_IF(
[test x$bar_found = xyes],
[AX_APPEND_LINK_FLAGS([$BAR_LIBS],[LDFLAGS])],
[AC_MSG_ERROR([*** bar requested but not found ***])])
]
)
AS_IF([test x$enable_bar = xyes],
[AS_IF(
[test x$bar_found = …Run Code Online (Sandbox Code Playgroud) 我正在尝试config.h.in向 Autotools提供一个。该主题在 Autoconf 手册中的4.8.1 Configuration Header Templates 中介绍。config.h.in看起来像这样:
/// \file config.h
/// \brief Library configuration file
#ifndef CRYPTOPP_CONFIG_H
#define CRYPTOPP_CONFIG_H
// define this if running on a big-endian CPU
#undef CRYPTOPP_BIG_ENDIAN
// define this if running on a little-endian CPU
#undef CRYPTOPP_LITTLE_ENDIAN
#endif // CRYPTOPP_CONFIG_H
Run Code Online (Sandbox Code Playgroud)
我们configure.ac的测试包括以下内容:
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile] [libcryptopp.pc])
AC_CONFIG_SRCDIR([configure.ac])
AC_PROG_LIBTOOL
LT_INIT
AC_PROG_CXX
AC_LANG([C++])
AC_PROG_GREP
Run Code Online (Sandbox Code Playgroud)
之后autoreconf和configure运行,是有config.h。问题是,它不遵循模板config.h.in。它看起来像是config.h由工具生产的新产品。
当我检查时,config.log我只看到一个提及config.h. …
我正在构建一个动态库libfoo.so,该库取决于libcrypto.so。
在我的自动工具Makefile.am文件中,我有这样一行:
libfoo_la_LIBADD += -L${OPENSSL_DIR}/lib -lcrypto
Run Code Online (Sandbox Code Playgroud)
其中$OPENSSL_DIR缺省为/usr,但可以通过使被覆盖--with-openssl-dir=/whatever。
我如何确保(仅)libfoo.so使用一个可执行文件而无需构建或运行该可执行文件的人来使用或摆弄?${OPENSSL_DIR}/lib/libcrypto.sorpathLD_LIBRARY_PATH
就目前情况而言,我可以构建libfoo并通过--with-openssl-dir=/usr/local/openssl-special,并且构建良好。但是,当我运行ldd libfoo.so,它只是指向libcrypto.so在/usr/lib。
我能想到的唯一解决方案是静态链接libcrypto.a到libfoo.so。还有其他可能的方法吗?