Использование библиотеки c в коде c ++ с makefile

У меня есть библиотека C, созданная cluster.h и cluster.c. Я собрал это с gcc -c cluster.c,

Я должен использовать метод этой библиотеки в главном классе проекта C ++. Это make-файл, который я использую:

abundancebin: main.o profileManager.o myHash.o myMalloc.o myStack.o myStringHash.o
g++ -o abundancebin main.o profileManager.o myHash.o myMalloc.o myStack.o         myStringHash.o
main.o: main.cpp
g++ -c main.cpp
profileManager.o: profileManager.cpp
g++ -c profileManager.cpp
myHash.o: myHash.cpp
g++ -c myHash.cpp
myMalloc.o: myMalloc.cpp
g++ -c myMalloc.cpp
myStack.o: myStack.cpp
g++ -c myStack.cpp
myStringHash.o: myStringHash.cpp
g++ -c myStringHash.cpp

clean:
-rm *.o abundancebin

Я попытался импортировать библиотеку C в main.cpp, используя после других импортов:

#ifdef __cplusplus
extern "C" {
#endif
#include <cluster.h>
#ifdef __cplusplus
}
#endif

но когда я собираю с make у меня есть этот ответ:

main.cpp:29:21: fatal error: cluster.h: No such file or directory
#include <cluster.h>
^
compilation terminated.
make: *** [main.o] Error 1

если я использую «cluster.h» вместо меня, у меня есть эта ошибка:

main.o:main.cpp:(.text+0xf68): riferimento non definito a "kmedoids"main.o:main.cpp:(.text+0xf68): rilocazione adattata per troncamento: R_X86_64_PC32 contro il simbolo non definito "kmedoids"/usr/bin/ld: main.o: bad reloc address 0x18 in section.xdata»
collect2: error: ld вернул 1 состояние выхода
делать: * [abundancebin] Ошибка 1`

Я также попытался скопировать часть кода, которая мне нужна, из библиотеки C в проект C ++, но компилятор сообщает о многих подобных ошибках:

error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive] vector = malloc(nnodes*sizeof(int));

Файлы библиотеки находятся в одной папке с файлами проекта. Может кто-нибудь помочь?
Спасибо

0

Решение

Если вы хотите добавить некоторый код, написанный на языке c, вы должны #include его следующим образом:

extern "C" {
#include "x264.h"}

которые говорят компилятору работать с ним по-другому, и нет необходимости менять код на c ++

1: вы добавляете свой код как: #include <cluster.h>
лучше изменить его на: #include "cluster.h"
другое дело, второй говорит компилятору сначала искать ваш заголовок в текущем каталоге, а затем в главном каталоге библиотек c ++

ваша ошибка:

main.cpp:29:21: fatal error: cluster.h: No such file or directory

потому что он не может найти заголовок, так что если cluster.h находится в том же каталоге, что и main.cppиспользовать #include "cluster.h"
или вы можете использовать -I. (которые говорят его в текущем каталоге) или -I/address сообщить компилятору, где искать заголовок

когда вы исправляете это, вы получаете вторую ошибку, которая, по-моему, из-за вашего кода, и я думаю, что из-за вашего кода в main.cpp, и не иметь ничего с вашим кодом кластера, я предлагаю, попробуйте опубликовать свой код, чтобы выяснить, в чем проблема

3

Другие решения

В ответ на ваш вопрос я хотел бы подойти примерно так в make-файле:

all: cfile.o
g++ main.cpp -o app

cfile.o: cluster.c cluster.h
gcc -c cluster.c

Примечание. Предполагается, что все находится в одном каталоге, поэтому позаботьтесь о том, чтобы указать пути, если нет.

Дайте мне знать о любых дальнейших ошибках.

-1

По вопросам рекламы [email protected]