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

0

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

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

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: ошибка: ld возвращен 1 статус выхода make: * [обилиеbin] Ошибка 1'

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

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

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

  • 0
    Попробуйте изменить <cluster.h> к "cluster.h" . (Кавычки вместо угловых скобок). Угловые скобки указывают компилятору искать в его собственном каталоге; кавычки говорят ему начинать поиск в той же директории, где находится ваш исходный файл.
  • 0
    Или добавить -I . на ваши флаги компиляции (чтобы добавить текущий каталог в список искомых включаемых путей).
Показать ещё 9 комментариев
Теги:
makefile

2 ответа

3
Лучший ответ

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

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, и у меня нет ничего с вашим кодом кластера, я предлагаю, кода, чтобы узнать, в чем проблема

-1

Отвечая на ваш вопрос, я бы подошел к нему примерно так в make файле:

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

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

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

Сообщите мне о каких-либо дополнительных ошибках.

  • 0
    Извините, но я не совсем понимаю, что писать в make-файле. Можете ли вы изменить мой (или его часть), чтобы быть более понятным? Это моя вина, если я не понимаю, потому что я все еще не очень хорош в этом, и вы бы мне очень помогли! Спасибо!
  • 0
    @leonardovet Я просто упростил это для тебя. Сравните с тем, что вы сделали, а также, в частности, то, что вы делаете со своим main, который содержит точку входа - вы не должны связывать main.o ни с чем. Просто следуйте структуре, которую я дал. Я не могу исправить это для вас, потому что у меня нет вашего источника, поэтому не знаю, что зависит от чего.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню