Изменение make-файла для включения скомпилированных извне объектов

Я пытаюсь изменить Makefile, чтобы включить внешне скомпилированный объект, но получаю сообщение об ошибке «неопределенная ссылка». Это первый раз, когда я имею дело с Makefiles - пожалуйста, будьте осторожны.

Что я сделал до сих пор:

  • Изменен main.c для включения нового заголовочного файла cudacrack.h.
  • Добавлен вызов runCudaImplementation() в main.c, который определен в cudacrack.h.
  • Изменен файл Makefile.in, чтобы включить cudacrack.o в качестве зависимости объекта.
  • Изменен Makefile.in для включения cudacrack.h в качестве исходного файла.
  • сделать чистым
  • Скомпилирован cudacrack.c с помощью: g++ -c cudacrack.c -o cudacrack.o
  • ./настроить
  • сделать --debug==подробный

Я получаю эту ошибку во время связывания:

g++ -L/usr/local/cuda/lib64/ -lcuda -lcudart  -g -O2 -funroll-loops -O3   -o fcrackzip  main.o crack.o cudacrack.o
main.o: In function `main':
$HOME/fcrackzip/fcrackzip-1.0/main.c:367: undefined reference to `runCudaImplementation'
collect2: ld returned 1 exit status

Примечание. На данный момент имя файла «cuda» содержит только основные методы C. Позже я скомпилирую эту часть с nvcc. Я поясню немного больше по другому моему вопросу, который привел меня сюда: Создание программы GPL C с модулем CUDA

Some debug info from make:
     Considering target file `cudacrack.h'.
       Finished prerequisites of target file `cudacrack.h'.
      No commands for `cudacrack.h' and no prerequisites actually changed.
      No need to remake target `cudacrack.h'.

..later..

    Considering target file `cudacrack.o'.
      Considering target file `cudacrack.c'.
       Finished prerequisites of target file `cudacrack.c'.
      No need to remake target `cudacrack.c'.
     Finished prerequisites of target file `cudacrack.o'.
     Prerequisite `cudacrack.c' is older than target `cudacrack.o'.
    No need to remake target `cudacrack.o'.

Что должно произойти, чтобы make связал основную программу с зависимостью cudacrack.o?


person emulcahy    schedule 23.02.2012    source источник
comment
Было бы полезно, если бы вы показали нам, как ваш make-файл строит другие объекты - я подозреваю, что проблема в несовместимости. Попробуйте более простой случай; напишите небольшую тестовую процедуру для cudacrack (если вы еще этого не сделали) и подтвердите, что вы можете ее собрать и запустить. Тогда попробуйте средний случай...   -  person Beta    schedule 23.02.2012


Ответы (1)


Вы проверили, действительно ли символ runCudaImplementation определен в cudacrack.o? Возможно, имя было искажено, потому что вы используете g++ для его компиляции, а не gcc.

person eriktous    schedule 23.02.2012
comment
Я думаю, вы выиграли: $objdump -t cudacrack.o: 0000000000000000 g F .text 0000000000000000b _Z21runCudaImplementationv, $objdump -t -C cudacrack.o: 00000000000000000 g F .text 00000000000000000b Спасибо! - person emulcahy; 25.02.2012