Стандарт не полностью определяет разницу между #include "..."
и #include <...>
, но во всех компиляторах я знаком с синтаксисом <>
для include, который обычно означает «это заголовочный файл системного типа» а синтаксис ""
означает «это заголовочный файл локального типа».
На практике это обычно означает, что ""
ищется в рабочем каталоге, а затем в каталогах, указанных параметрами -I
в компилятор и, наконец, в системные каталоги по умолчанию, в то время как <>
то же самое, за исключением того, что он не выглядит в рабочем каталоге.
Итак, вам нужно либо изменить код для использования:
#include "population.h"
или же вам нужно добавить -I.
в строку компиляции, чтобы компилятор знал, как искать в текущем каталоге:
population.o: population.cpp population.h organism.h
g++ -I. -c population.cpp
Лично я бы сделал и то и другое, потому что добавить гигиену - это хорошая гигиена каталоги, которые вам нужны для вашей строки компиляции, и потому что это хорошая практика - использовать ""
для локальных заголовков, чтобы люди, читающие код, сразу поняли, что это ваша голова и не системный заголовок.
По второму вопросу: Является ли компиляция для того, чтобы сделать общий объектный файл с объектными файлами правильными Извините, но я не понимаю то, что вы спрашиваете.
Если вы спрашиваете о порядке целей, определенных в make-файле, то они могут быть в любом порядке на всех , за исключением , что первой целью будет цель по умолчанию (если вы запускаете make
без имени цели, make создаст первую цель - и все необходимые условия для первой цели).
ETA
ОК, теперь мы видим, что фактическая ошибка в том, что example.o
не существует. Почему этого не существует? Опять же, поскольку вы удалили важные детали из примера в своем вопросе, мы не можем сказать наверняка. Когда вы пишете в своем вопросе:
example.so: //some .o files which are not important// HERE IS THE PROBLEM
, что именно являются .o
файлами, которые появляются как предварительные условия для example.so
?
Вы должны перечислить файл example.o
как предварительное условие example.so
, если вы хотите, чтобы make собрал example.o
, прежде чем пытаться собрать example.so
. Вам необходимо перечислить все объектные файлы, необходимые для создания общей библиотеки. Так что это должно быть:
example.so: population.o example.o neat.o network.o nnode.o link.o trait.o gene.o innovation.o organism.o species.o genome.o
Неважно, в каком порядке они появляются в списке предварительных условий, но все они должны быть там.