Почему включение файла заголовка fftw3.h работает с угловыми скобками, но не с кавычками?

#boost #compiler-errors #include

Вопрос:

Прежде всего, я понимаю разницу между использованием угловых скобок для включения файлов и использованием кавычек. А именно, что угловые скобки заставляют препроцессор искать файл в зависимости от реализации, а использование кавычек означает, что препроцессор выполняет поиск сначала в каталоге проекта, а затем в пути поиска, используемом для формы #include. Я понимаю разницу, но мой вопрос заключается в том, почему «зависящий от реализации способ» поиска файлов, включенных в угловые скобки, не работает для меня, когда он всегда работал раньше.

Я пытаюсь скомпилировать и запустить код на c . Я набираю в командной строке следующее:

 cmake -DCMAKE_CXX_COMPILER=gcc-11 ..
make
 

Он начинает компилироваться, затем я получаю следующую ошибку:

 /Users/[me]/Desktop/cosmograph/ICs/../utils/Fourier.h:9:10: fatal error: fftw3.h: No such file or directory
    9 | #include <fftw3.h>
 

Теперь у меня установлен fftw через homebrew, и он обновлен. Я также попытался переустановить его. Я вижу, что он находится на моей машине в /usr/local/opt/fftw и также /usr/local/Cellar/fftw . Я смог найти обходной путь, просто скопировав файл заголовка из /usr/local/Cellar/fftw/3.3.9_1/include/fftw3.h каталога проекта и изменив #include <fftw3.h> его на #include "fftw3.h" .

Вот моя главная проблема — почему включение его в кавычки работает, а скобки-нет? Я считаю, что на моем ПУТИ есть правильные каталоги:

 echo $PATH
/anaconda3/bin:/Users/[me]/anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin:/Users/[me]/opt/bin:usr/local:/usr/local/Cellar:/usr/local/include:/usr/local/include/
 

Это все еще проблема, потому что компилятор теперь зацикливается на той же проблеме позже в коде. Я получаю эту ошибку сейчас:

 /Users/[me]/Desktop/cosmograph/components/static/static_ic.cc:8:10: fatal error: boost/math/special_functions/spherical_harmonic.hpp: No such file or directory
    8 | #include <boost/math/special_functions/spherical_harmonic.hpp>
 

У меня установлен boost от homebrew, и этот конкретный файл, который он пытается включить, находится по адресу: /usr/local/Cellar/boost/1.76.0/include/boost/math/special_functions/spherical_harmonic.hpp . Я могу сделать то же самое обходное решение здесь и включить этот файл, написав:

 #include "/usr/local/Cellar/boost/1.76.0/include/boost/math/special_functions/spherical_harmonic.hpp"
 

но затем у меня возникла проблема, потому spherical_harmonic.h что файл, как и многие файлы в библиотеке boost, включает другие файлы в библиотеке boost, используя скобки. Я действительно предпочел бы не просматривать каждый файл, который мне нужно включить, и не изменять строки #include, чтобы использовать кавычки вместо скобок.

Я также попытался сделать следующее:

 cmake -DCMAKE_CXX_COMPILER=gcc-11 -DCMAKE_CXX_FLAGS="-I/usr/local/opt/fftw/include/ -I/usr/local/Cellar/boost/1.76.0/include/" ..
make
 

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

Наверное, я думаю, что это, должно быть, какая-то проблема с моим путем, но я действительно чешу голову над этим. Не могли бы вы, пожалуйста, дать мне знать, что я делаю не так?

Спасибо!

Комментарии:

1. Забыл сказать, что я использую Mac под управлением macOS Catalina 10.15.7

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

3. @PeteBecker Конечно, в этом есть смысл. Но я установил библиотеку Boost, которая содержит множество файлов, заголовки которых заключены в угловые скобки. Поскольку включение файлов в угловые скобки для меня не работает, я не могу включить ни один из файлов boost, не пройдя через каждый из них и не изменив строки #include. Опять же, это проблема, с которой я раньше не сталкивался, поэтому я хотел бы докопаться до сути того, что может быть ее причиной.

4.Я думаю, что ваше описание проблемы "why does including it with quotes work but brackets doesn't?" довольно вводит в заблуждение. Он работает только with quotes после того, как вы вручную скопировали заголовок в определенный каталог. Каков абсолютный путь к fftw3.h файлу, который вы хотите включить? Вам необходимо настроить -I... параметры, переданные компилятору/препроцессору, чтобы включить каталог, содержащий этот файл.

5. @G. M. Спасибо за ваш комментарий, вы правы, то, как я написал вопрос, немного вводит в заблуждение. Я пытался придумать, как настроить -I... параметры, но вызов cmake с -DCMAKE_CXX_FLAGS= "-I..." помощью не сработал, поэтому я застрял. Для тех, кому интересно, я в конце концов смог скомпилировать код, записав find_package(Boost REQUIRED) n include_directories(${Boost_INCLUDE_DIRS}) его в CMakeLists.txt файл и изменив используемый компилятор с gcc на g . Все еще не совсем понимаю, почему это не сработало по-другому.