Добавить один заголовок из другого проекта в мой проект с помощью automake

Я работаю над относительно большим проектом, в котором используется система сборки automake.

Теперь проблема в том, что мне нужно связать проект с библиотекой из другого проекта (это работает нормально), но мне также нужно включить заголовок из другого исходного дерева проекта (api.h).

INCLUDES = -I@REMOTE_PROJECT_DIR@

в Makefile.am не работает, потому что в удаленном исходном каталоге есть файлы .h с конфликтующими именами. Как я могу добавить только api.h?

Я использовал символическую ссылку в каталоге include в проекте, но теперь мне нужно поместить исходники в общедоступный репозиторий, и все, кто работает с ним, имеют другой проект в другом каталоге, поэтому мне нужно использовать параметр configure.


person Šimon Tóth    schedule 05.03.2010    source источник


Ответы (2)


Вы не хотите каким-либо образом изменять Makefile.am или configure.ac. Если api.h установлен в стандартном расположении (например, /usr/include), то все, что вам нужно, это AC_CHECK_HEADERS([api.h]) в configure.ac. Если api.h установлен в нестандартном месте (например, /home/joe/include), способ его подключения к вашему проекту определяется во время настройки. Когда вы запускаете configure, вы добавляете аргумент CPPFLAGS=-I/home/joe/include к вызову configure. Вы не указываете нестандартное расположение в самих файлах сборки.

Другой альтернативой является использование pkg-config, но нестандартное расположение вашего заголовочного файла все равно будет обработано при запуске configure. (На этот раз установив PKG_CONFIG_PATH, а не CPPFLAGS)

person William Pursell    schedule 09.03.2010
comment
Да, в нестандартном месте. Но как мне скомпилировать файлы по заголовку? Мне также нужно иметь путь включения во время компиляции, иначе это не сработает. - person Šimon Tóth; 09.03.2010
comment
Когда вы добавляете CPPFLAGS=-I/path/to/include, вы сообщаете системе сборки, где ей нужно искать заголовочные файлы. Все вызовы make, вызывающие препроцессор, будут иметь параметр -I/path/to/include, переданный в качестве аргумента $CPP. - person William Pursell; 10.03.2010
comment
Я знаю, но именно об этом мой вопрос. Как мне это сделать без добавления пути включения. Потому что это то, чего я не могу сделать. - person Šimon Tóth; 10.03.2010
comment
Вы не можете, кроме как исказив свой проект. Если вы хотите избежать необходимости вводить его, вы можете поместить его в свою среду или использовать CONFIG_SITE. Нестандартное расположение, в котором вы установили зависимость на своем компьютере, не является неотъемлемой частью вашего проекта, и поэтому файлы сборки вашего проекта ничего не должны знать об этом. - person William Pursell; 11.03.2010

Если у вас есть заголовки с одинаковыми именами, вы можете поместить хотя бы один из них в каталог с другим именем и включить его, используя имя каталога.

Вот пример структуры каталогов:

mylibrary/include/myblirary/api.h

myproject/api.h 
myproject/main.cpp 

В main.cpp:

#include "api.h"
#include "mylibrary/api.h"

#include <boost/regex.hpp>

При компиляции:

g++ -I mylibrary/include

person Dmitry Yudakov    schedule 05.03.2010