Итак, мне нужно сделать основной Makefile для программы, которую я написал. Вот файлы:Проблема с реализацией базового Makefile в c
list.c
hash.c
order_book.c
libdefault_hash.a //provided already so I do not need to create.
Мне нужно создать библиотеки для list.c и hash.c так, что портфель заказов может использовать их при компиляции. Так это то, что я в настоящее время в Makefile
:
all: orderbook
orderbook: orderbook.c liblist.a libhash.a
gcc -std=c99 -o orderbook order_book.c list.c -L. -llist -lhash -libdefault_hash
liblist.a: list.c
gcc -std=c99 -c list.c
ar rcu liblist.a list.o
libhash.a: hash.c
gcc -std=c99 -c hash.c
ar rcu libhash.a hash.o
Мое понимание того, как работают Makefiles очень мало, но вот мой мыслительный процесс,
all: orderbook
будет означать, чтоorderbook:
будет работать.orderbook.c
затем скомпилирует, затем код скомпилирует библиотеки.После библиотеки компилируются он будет работать:
gcc -std=c99 -o orderbook order_book.c list.c -L. -llist -lhash -libdefault_hash
И результат должен быть простой программный файл с именем портфель заказов, но терминал печатает:
$ make
gcc -std=c99 -o orderbook order_book.c list.c hash.c -L. -llist -lhash -libdefault_hash
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ld: skipping incompatible ./liblist.a when searching for -llist
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -llist
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -libdefault_hash
collect2: ld returned 1 exit status
make: *** [orderbook] Error 1
$
Любая помощь/руководство очень ценится.
nitpick: сам makefile не содержит кода на языке C; вы просто используете его для компиляции чего-то * else *, написанного на C. –
Почему Make не пытаться построить библиотеки перед исполняемым файлом? Я предполагаю: вы построили библиотеки на предыдущем шаге, которые вы нам не показываете. Почему 'list.c' появляется в команде компилятора, которая также вызывает' liblist.a'? Я еще подумаю: вы не получили эти команды для работы из командной строки. ** Вы должны знать, как создать файл, прежде чем вы сможете определить, как его построить. ** – Beta
Примечание. При выполнении этого вы можете использовать -ldefault_hash. Номенклатура кажется немного неправильной по сравнению с вашими другими библиотеками. Некоторое время назад я сделал это, сделаю ymmv. И есть гораздо более простые способы сделать это. и 'list.c' не должны находиться на линии компиляции для' orderbook'; его уже в 'liblist.a' – WhozCraig