Я очень смущен этим странным поведением моего проекта .cpp. Я получил следующую структуру папок:Различные пути, используемые для #include и других файлов
include/mylib.h
myproject/src/eval.cpp
myproject/data/file.csv
myproject/Makefile
В eval.cpp я включаю mylib.h следующим образом:
#include "../../include/mylib.h"
и скомпилировать его с помощью Makefile:
all:
g++ -I include ../include/mylib.h src/eval.cpp -o eval.out
В настоящее время в my eval.cpp Я читаю файл.csv из каталога данных, и если я нахожу его так, как это
../data/file.csv
он не находит (получает пустые строки все время), но это
data/file.csv
работает отлично.
Итак, чтобы включить mylib.h, он отправляет два каталога вверх (из папки src), что кажется правильным. Но мне не имеет смысла, что для ссылки на другой файл из той же части кода он предполагает, что мы находимся в каталоге проекта. Я полагаю, что это связано с Makefile каким-то образом, но я не уверен.
Почему это так?
EDIT: После того, как несколько вещи, которую я попробовал это, кажется, что путь, который используется не путь от бинарного местоположения до местоположения данных, но зависит от , где от я бег бинарника, а также. Т.е., если у меня есть двоичный файл в директории бен и запустить его любит:
./bin/eval.out
Он работает с data/file.csv
.
Это:
cd bin
./eval.out
работы с ../data/file.csv
.
Теперь это кажется мне очень запутанным, поскольку в зависимости от того, где я запускаю программу, он будет давать разные результаты. Может ли кто-нибудь подумать о причинах такого поведения, и если это нормально или я ошибаюсь?
Да, расположение файла .h имеет смысл в обоих случаях. Итак, если я помещаю Makefile в каталог src, путь должен быть изменен на ../data/file.csv? – sashkello
Важно то, где выведенный двоичный код заканчивается. Если он находится в каталоге src, тогда да. Обычно, однако, чаще встречается, что двоичный файл отправляется в каталог '/ bin' или непосредственно в корневом каталоге проекта. Это делает чистку иерархии (т. Е. 'Src' содержит исходные файлы и ничего больше), а в случае корневого каталога проекта можно упростить определение/более понятный путь к файлам (не нужно отступать на несколько шагов, затем спускаться вниз снова в иерархии). – JBL
ОК, так что если я делаю -o bin/eval.out, то мне нужно изменить путь к ../data/file.csv, правильно? – sashkello