在c ++代码中使用c库和makefile

时间:2014-08-19 15:24:24

标签: c++ c makefile c-libraries

我有一个由cluster.h和cluster.c构建的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

我尝试在其他导入之后使用main.cpp导入C库:

#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

如果我使用&#34; cluster.h&#34;而不是我有这个错误:

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&#39。 collect2:错误:ld返回1退出状态 make: * [abundancebin]错误1`

我还尝试将我需要的代码部分从C库复制到C ++项目,但编译器报告了许多这样的错误:

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

库文件位于项目文件的同一文件夹中。有人可以帮忙吗? 谢谢

2 个答案:

答案 0 :(得分:3)

如果你想添加一些用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.hmain.cpp位于同一目录中,请使用#include "cluster.h" 或者您可以使用-I.(在当前目录中告诉它)或-I/address告诉编译器在哪里查找您的标题

当你更正它时,你得到第二个错误,我相信它是因为你的代码,而且我认为是因为你的代码在main.cpp,而且你的群集代码没有任何内容,我建议,尝试发布您的代码,找出问题所在

答案 1 :(得分:-1)

在回答你的问题时,我会在makefile中接近这样的事情:

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

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

注意:这假设所有内容都在同一目录中,因此如果没有,请注意指定路径。

让我知道任何进一步的错误。