У меня есть рабочий каталог, как показано ниже:
. /
| ---- HelloWorld /
| ---- | ---- main.cpp
| ---- | ---- Makefile.am
| ---- Pet /
| ---- | ---- Pet.h
| ---- | ----Pet.cpp
| ---- build /
| ---- configure.ac
| ---- Makefile.am
Я хотел бы использовать автоинструмент для созданияmakefile, а затем соберите проект в каталоге сборки.
. / configure.ac - это
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([Hello], [1.0], [qub@oregonstate.edu])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AC_CONFIG_SRCDIR([HelloWorld/main.cpp])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
. / Makefile.am is
include HelloWorld/Makefile.am
Обратите внимание, что я использую include, чтобы убедиться, что исполняемый файл находится в каталоге, где выполняется команда make.
. / HelloWorld / Makefile. am is
AM_CPPFLAGS=-I%D%/../Pet/ -I%D% -I%C%
#VPATH = ./HelloWorld ./Pet
bin_PROGRAMS=hello
hello_SOURCES=%D%/../Pet/Pet.h
hello_SOURCES+=%D%/../Pet/Pet.cpp
hello_SOURCES+=%D%/main.cpp
На случай, если некоторые люди захотят попробовать на своем компьютере, я прилагаю другие исходные коды здесь: main.cpp
#include <stdio.h>
#include <vector>
#include "Pet.h"
int main() {
printf("Hello World\n");
std::vector<Pet*> all_pets;
Pet *dog = new Pet(string("Apple"));
all_pets.push_back(dog);
Pet *cat = new Pet(string("Pear"));
all_pets.push_back(cat);
for (int i = 0; i < all_pets.size(); i++) {
all_pets[i]->showName();
}
return 0;
}
**Pet.h**
#pragma once
#include <string>
using namespace std;
class Pet
{
public:
Pet(string name);
~Pet();
void showName();
void showIndex();
string _name;
int _index;
};
Pet.cpp
#include "Pet.h"
Pet::Pet(string name)
{
_name = name;
srand(2345);
_index = (rand() % 100);
}
Pet::~Pet()
{
}
void Pet::showIndex()
{
printf("Index is %d\n", _index);
}
void Pet::showName()
{
printf("Name is %s\n", _name.c_str());
}
Постановка проблемы
- Может успешно создать make-файл при запуске
./ $autoreconf --install
Может успешно построить проект в корневом каталоге с помощью следующих команд
./ $./configure
./ $make
Получить ошибку при сборке в директории ./build. Команды:
./build/ $../configure
./build/ $make
Получена ошибка, как показано на рисунке ниже:
Изображение ошибки сборки
Я думаю, что эта ошибка вызванаКомпилятор не может успешно найти заголовочные файлы. Мой первый вопрос Почему AM_CPPFLAGS=-I%D%/../Pet/ -I%D% -I%C%
в makefile.am не может решить эту проблему?
Поскольку компилятор создает файлы .o в каталоге компоновки, при этом дерево компоновки имеетта же схема подкаталога, что и у исходного дерева. Так что я могу решить эту проблему, скопировав файл Pet.h в \ build \ Pet. Однако это означает, что мне всегда нужно копировать файлы заголовков в каталог сборки, что не удобно.
Я нахожу некоторую информацию о VPATH . Поэтому я прокомментировал #VPATH = ./HelloWorld ./Pet
in ./HelloWorld/Makefile.am. Тем не менее, это вызовет у меня новую проблему:
ошибка с изображением automake
Я предполагаю, что настройка VPATH каким-то образом конфликтует с файлом make make.am. Мой второй вопрос Как правильно использовать VPATH с использованием include makefile?