2013-10-20 2 views
1

Итак, мне нужно сделать основной 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 очень мало, но вот мой мыслительный процесс,

  1. all: orderbook будет означать, что orderbook: будет работать.
  2. orderbook.c затем скомпилирует, затем код скомпилирует библиотеки.
  3. После библиотеки компилируются он будет работать:

    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 
$ 

Любая помощь/руководство очень ценится.

+0

nitpick: сам makefile не содержит кода на языке C; вы просто используете его для компиляции чего-то * else *, написанного на C. –

+0

Почему Make не пытаться построить библиотеки перед исполняемым файлом? Я предполагаю: вы построили библиотеки на предыдущем шаге, которые вы нам не показываете. Почему 'list.c' появляется в команде компилятора, которая также вызывает' liblist.a'? Я еще подумаю: вы не получили эти команды для работы из командной строки. ** Вы должны знать, как создать файл, прежде чем вы сможете определить, как его построить. ** – Beta

+0

Примечание. При выполнении этого вы можете использовать -ldefault_hash. Номенклатура кажется немного неправильной по сравнению с вашими другими библиотеками. Некоторое время назад я сделал это, сделаю ymmv. И есть гораздо более простые способы сделать это. и 'list.c' не должны находиться на линии компиляции для' orderbook'; его уже в 'liblist.a' – WhozCraig

ответ

1

Давайте сделаем это небольшими шагами. Во-первых, вот последовательность команд, которая выглядит как то, что вы имеете в виду:

gcc -std=c99 -c list.c -o list.o 
ar rcu liblist.a list.o 
gcc -std=c99 -c hash.c -o hash.o 
ar rcu libhash.a hash.o 
gcc -std=c99 -o orderbook order_book.c -L. -llist -lhash -libdefault_hash 

Try эти команды без сделать и посмотреть, какие из них работают (вы уверены, что «РКО» не должно быть «-rcu «?). Расскажите нам результаты, комментируя этот ответ или редактируя свой вопрос. Как только работает с любыми, мы можем начать писать make-файл.

+0

Все работало, за исключением последней строки. Ошибка заключалась в том, что 'skipping несовместимо ./libdefault_hash.a при поиске -ldefault_hash' Теперь я собираюсь изменить мой код. У меня есть make-файл, делающий то, что я хочу, кроме этой строки кода, или, по крайней мере, это то, что я думаю. – JumpingRock

+2

Эта ошибка означает, что библиотека 'libdefault_hash.a', которую у вас есть, недействительна для той системы, для которой вы компилируете. Он был создан для другой архитектуры. Вы не можете взять библиотеку, скомпилированную для системы ARM, и использовать ее в системе Intel, например.Вы также не можете взять библиотеку, собранную для 32-битного Intel и связать ее с 64-битной программой Intel (или наоборот). Вам нужно узнать, кто из вас дал вам эту библиотеку, для какой цели она была создана, и убедитесь, что вы можете скомпилировать свой код для одной и той же цели. – MadScientist

+0

СПАСИБО ВАШ это то, что было не так точно. Мне просто нужно было положить -m32! Спасибо за вашу помощь. Я очень ценю это. – JumpingRock

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