【问题标题】:Using c library in c++ code with makefile在带有makefile的c ++代码中使用c库
【发布时间】:2014-10-12 18:43:44
【问题描述】:

我有一个由 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

如果我使用“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: * [abundancebin] 错误 1`

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

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

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

【问题讨论】:

  • 尝试将&lt;cluster.h&gt; 更改为"cluster.h"。 (引号而不是尖括号)。尖括号告诉编译器在自己的目录中搜索;引号告诉它在源文件所在的同一目录中开始搜索。
  • 或将-I . 添加到您的编译标志(将当前目录添加到搜索的包含路径列表中)。
  • 改进您的Makefile。参见例如this example
  • invalid conversion from `void*` to `int` 在 C 中有效,将导致此错误的代码放入 extern "C"{}
  • 对不起,我不明白如何改进我的makefile作为例子

标签: c++ c makefile c-libraries


【解决方案1】:

如果你想添加一些用c语言编写的代码,你必须像#include一样:

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

它告诉编译器以不同的方式处理它,并且没有必要将你的代码更改为 c++

1:您将代码添加为:#include &lt;cluster.h&gt; 最好将其更改为:#include "cluster.h" 不同的是,第二个告诉编译器首先在当前目录中搜索你的头文件,然后在主 c++ 库目录中搜索

你的错误:

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

是因为找不到header,所以,如果cluster.hmain.cpp在同一目录下,使用#include "cluster.h" 或者你可以使用-I.(告诉它在当前目录中)或-I/address告诉编译器在哪里寻找你的头文件

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

【讨论】:

    【解决方案2】:

    在回答你的问题时,我会在 makefile 中这样处理它:

    all: cfile.o
        g++ main.cpp -o app
    
    cfile.o: cluster.c cluster.h
        gcc -c cluster.c
    

    注意:这假设所有内容都在同一个目录中,所以如果不是,请注意指定路径。

    如果有任何进一步的错误,请告诉我。

    【讨论】:

    • 很抱歉,我不太清楚在makefile 中要写什么。你能修改我的(或部分)更清楚吗?如果我不明白是我的错,因为我仍然不擅长这个,你会给我很大的帮助!谢谢!
    • @leonardovet 我只是为你简化了它。与您所做的比较,尤其是您对包含入口点的 main 所做的比较 - 您不应该将 main.o 链接到任何东西。只需按照我给出的结构即可。我无法为你修复它,因为我没有你的来源,所以不知道什么取决于什么。
    • @hyde 好地方!我忘记了输出可执行文件。修复了代码。
    • 你再次运行makefile。
    • 这一切都取决于源文件的依赖关系。我举了一个简单的例子,但除了给出的信息之外,没有什么可继续的。例如,我给出的示例取决于包含在 main.cpp 中的 cluster.h - 这是如何构建 makefile 的示例,不一定能神奇地修复所有内容。这就是为什么我记下任何特定错误都会被通知的原因。
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多