gpt4 book ai didi

cross-compiling - Autotools 交叉编译和生成源

转载 作者:行者123 更新时间:2023-12-04 07:07:46 26 4
gpt4 key购买 nike

我正在尝试使用 autotools(autoconf、automake、libtool)作为构建系统来创建一个库。该库必须是可交叉编译的,但构建它的步骤之一是在整个过程中通过从源构建的可执行文件生成源。

问题是我不能使用 automake 的系统来构建中间二进制文件,因为当它交叉编译时,它不会在“--build”上运行来生成源代码。

解决这个问题的一种方法是创建单独的 autools 项目来构建中间二进制文件,但我想避免它,因为中间可执行文件和最终库有很多头文件和其他“数据”文件,所以我想保留它一个地方,除了那些中间二进制文件应该是“noinst”。

有没有其他方法可以让它正常工作并保持可移植性?我试图使用 ax_prog_cxx_for_build但是交叉编译时找不到--build的EXEEXT。

这是一个问题示例,只是为了说明我的问题:

配置.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([libfoobar], [0.1.0], [<NOBUGS>])
AM_INIT_AUTOMAKE([foreign])
LT_INIT

AC_CONFIG_SRCDIR([src/bar.cpp])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_FILES([Makefile
src/Makefile])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

Makefile.am

ACLOCAL_AMFLAGS = -I m4

SUBDIRS = src

src/Makefile.am

bin_PROGRAMS = bar
lib_LTLIBRARIES = libfoo.la

noinst_bar_SOURCES = bar.cpp

libfoo_la_SOURCES = foo.cpp
nodist_libfoo_la_SOURCES = foobar.h

BUILT_SOURCES: foobar.h

foobar.h: bar$(EXEEXT) Makefile
./$< >$@
CLEANFILES = foobar.h

src/foo.cpp

#include "foobar.h"

extern "C" int foo() {
return foobar_value;
}

src/bar.cpp

#include <iostream>

int main() {
std::cout << "#ifndef FOOBAR_H" << std::endl;
std::cout << "#define FOOBAR_H" << std::endl;
std::cout << std::endl;
std::cout << "static const int foobar_value = 0xdeadbeef;" << std::endl;
std::cout << std::endl;
std::cout << "#endif" << std::endl;
}

最佳答案

如果您使用 AX_PROG_CXX_FOR_BUILD ,那么您应该使用的 EXEEXT 是在宏 AX_PROG_CC_FOR_BUILD 中定义的 BUILD_EXEEXT (这 AX_PROG_CXX_FOR_BUILD 需要)。将 EXEEXT 用于由 CXX_FOR_BUILD 构建的内容将是错误的,因为这是主机工具链的扩展。所以在这种情况下,你需要更多类似的东西:

configure.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([libfoobar], [0.1.0], [<NOBUGS>])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
AC_CANONICAL_BUILD
AC_CANONICAL_HOST

AC_CONFIG_SRCDIR([src/bar.cpp])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_FILES([Makefile
src/Makefile])

# Checks for programs.
AC_PROG_CXX
AX_PROG_CXX_FOR_BUILD

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

src/Makefile.am

noinst_PROGRAMS = bar
lib_LTLIBRARIES = libfoo.la

bar_SOURCES = bar.cpp

LINK_FOR_BUILD.cpp = $(CXX_FOR_BUILD) $(CXXFLAGS_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) $(TARGET_ARCH_FOR_BUILD)

bar$(BUILD_EXEEXT) : $(bar_OBJECTS)
$(LINK_FOR_BUILD.cpp) $^ $(LOADLIBES_FOR_BUILD) $(LDLIBS_FOR_BUILD) -o $@

$(bar_OBJECTS) : CC=$(CC_FOR_BUILD)
$(bar_OBJECTS) : CXXFLAGS=$(CXXFLAGS_FOR_BUILD)
$(bar_OBJECTS) : CPPFLAGS=$(CPPFLAGS_FOR_BUILD)

libfoo_la_SOURCES = foo.cpp
nodist_libfoo_la_SOURCES = foobar.h

BUILT_SOURCES: foobar.h

foobar.h: bar$(BUILD_EXEEXT) Makefile
./$< >$@
CLEANFILES = foobar.h

关于cross-compiling - Autotools 交叉编译和生成源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24201260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com