gpt4 book ai didi

c++ - 无法将C共享库链接到C++程序

转载 作者:行者123 更新时间:2023-12-02 11:13:03 24 4
gpt4 key购买 nike

我正在尝试为项目编写一个makefile。该项目涉及一个测试程序,该程序定义了用C++ 11编写的主要功能,该功能应调用用c99编写的共享对象库并运行一些测试。

我的makefile成功编译了c99库,并生成“libhanoi.so”。

当我尝试将C99库链接到C++ 11部分时,出现以下错误:

g++ -std=gnu++11 -L. -lhanoi -o main tests/testing.cpp tests/main.cpp
/tmp/cctHQTcW.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
Makefile:29: recipe for target 'tests' failed
make: *** [tests] Error 1

但是,“nm -C libhanoi.so”的输出显示libhanoi.so正在导出binarion64_t函数:
0000000000000610 T binarion64_t(long long, long long)

当我在libhanoi.so的名称中输入拼写错误时,它会出现一个错误,指出找不到libhanoi.so。

因此它必须能够找到libhanoi.so,并且libhanoi.so在main.cpp中导出未实现的函数,但仍提供 undefined reference 。这是怎么回事?

最小示例:

hanoi.h:
#ifndef HANOI_H
#define HANOI_H

#include <inttypes.h>

// binarion (base -1+i) constructor
uint64_t binarion64_t(long long A, long long B);


#endif // HANOI_H

binarion.c:
#include "hanoi.h"

uint64_t binarion64_t(long long A,long long B){
return 0;
}

main.cpp:
#include <stdio.h>

extern "C" {
#include "hanoi.h"
};

uint64_t binarion_constructor(uint64_t * args){
return binarion64_t(args[0], args[1]);
}

int main(void){
return 0;
}

编译:
g++ -std=c99 -c binarion.c
g++ -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp

输出:
/tmp/ccjoRmCg.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status

编辑:

我正在运行的命令是:
gcc -std=c99 -c binarion.c
gcc -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp

这些文件正是问题中的文件。 “readelf -s libhanoi.so | grep binarion”的输出为:
12: 0000000000000660    19 FUNC    GLOBAL DEFAULT   11 binarion64_t
33: 0000000000000000 0 FILE LOCAL DEFAULT ABS binarion.c
46: 0000000000000660 19 FUNC GLOBAL DEFAULT 11 binarion64_t

并且“g++ -std = gnu++ 11 -L。-lhanoi -o main main.cpp”的输出为:
/tmp/cczfgY8M.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status

最佳答案

TL; DR:

采用:

gcc -std=c99 -c binarion.c
gcc -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp

说明:

您应该使用 gcc编译C文件, g++适用于C++。当您执行 g++ -std=c99 -c binarion.c时,编译器会提示您:
cc1plus: warning: command line option ‘-std=c99’ is valid for C/ObjC but not for C++

这意味着您最终将库编译为C++库。您可以通过调用 readelf -s libhanoi.so | grep binarion进行验证:
 9: 00000000000005da    19 FUNC    GLOBAL DEFAULT    9 _Z12binarion64_txx
29: 0000000000000000 0 FILE LOCAL DEFAULT ABS binarion.c
44: 00000000000005da 19 FUNC GLOBAL DEFAULT 9 _Z12binarion64_txx

如您所见,该函数已经过名称拼凑,C++可以做到,而C却没有。

但是,在编译 main.cpp时,您告诉编译器 binarion_t具有C链接:
extern "C" {
#include "hanoi.h"
};

因此,它正在搜索未破坏的 binarion_t(而不是 _Z12binarion64_txx)。

关于c++ - 无法将C共享库链接到C++程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49836510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com