#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 . Все еще не совсем понимаю, почему это не сработало по-другому.