2013-05-17 2 views
0

Я очень смущен этим странным поведением моего проекта .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.

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

ответ

2

Это потому, что (как объяснено here) компилятор будет искать файлы #included с кавычками (без скобок) с текущим рабочим каталогом, являющимся расположением исходного файла.

Затем, когда вы пытаетесь открыть свой CSV-файл, теперь ваша программа, которая ищет файл. Но ваша программа работает с текущим рабочим каталогом: myproject/, что объясняет, почему вы должны указать data/file.csv как свой путь к файлу, а не ../data/file.csv. Ваша программа не запускается в вашей папке src, она будет запускаться в каталоге, из которого вызывается двоичный код.

Возможно, вы заметили, что в вашем файле Makefile ваши параметры -I задают другой путь для вашего файла заголовка, чем ваш .cpp-файл.

EDIT Ответ: Это довольно просто на самом деле и совершенно нормально.Когда вы вызываете свой двоичный файл, каталог, в котором вы находитесь, является текущим рабочим каталогом. То есть, если вы запустите его с помощью команды ./myproject/bin/eval.out, текущий рабочий каталог будет. (например, /home/the_user/cpp_projects). Мой пост немного вводил в заблуждение, я исправил его.

Примечание. Вы можете использовать команду pwd в командной строке, чтобы узнать, какой текущий рабочий каталог этой подсказки (pwd обозначает «рабочий каталог печати»).

+0

Да, расположение файла .h имеет смысл в обоих случаях. Итак, если я помещаю Makefile в каталог src, путь должен быть изменен на ../data/file.csv? – sashkello

+0

Важно то, где выведенный двоичный код заканчивается. Если он находится в каталоге src, тогда да. Обычно, однако, чаще встречается, что двоичный файл отправляется в каталог '/ bin' или непосредственно в корневом каталоге проекта. Это делает чистку иерархии (т. Е. 'Src' содержит исходные файлы и ничего больше), а в случае корневого каталога проекта можно упростить определение/более понятный путь к файлам (не нужно отступать на несколько шагов, затем спускаться вниз снова в иерархии). – JBL

+0

ОК, так что если я делаю -o bin/eval.out, то мне нужно изменить путь к ../data/file.csv, правильно? – sashkello

Смежные вопросы