gpt4 book ai didi

c++ - 从 C 转换为 C++ 后对共享库函数的 undefined reference

转载 作者:行者123 更新时间:2023-11-30 18:31:19 25 4
gpt4 key购买 nike

我有一个共享库“libsharedlib.so”,它曾经是从 C 文件生成的。由于该库现在需要使用第三方 C++ 库中的函数,因此我想将我的共享库从 C 转换为 C++(代码相对简单)。基于我读过的差异here ,我必须做的唯一调整是使用 stdlib 和 stdio 函数。标题已更改为

#include <stdio.h>
#include <stlib.h>

#include <cstdlib>
#include <cstdio>

对这些库中函数的所有调用都以 std:: 命名空间为前缀(例如 std::malloc 而不是 malloc ,我没有使用using namespace std)。源文件扩展名从 .c 更改为 .cpp。我还必须在每个文件的末尾添加换行符,并且必须强制转换我的 malloc。此后没有其他编译器反馈。使用以下命令编译共享库:

pgcpp -shared -I./inc/ -o ./lib/libsharedlib.so file1.cpp file2.cpp ...

并且不返回任何错误或警告。

我现在有一个 MEX 函数 mex_gateway.cpp,它调用此库中的函数:

#include "sharedlibraryheader.h"
#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]){
...
function_from_library(data);
}

使用以下命令编译

mex -L./lib/ -lsharedlib -I./inc/ mex_gateway.cpp

(当添加详细标志 -v 时)实际上执行以下命令:

g++ -c  -I./inc/ -I/opt/MATLAB/R2013b/extern/include -I/opt/MATLAB/R2013b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread  -DMX_COMPAT_32 -O -DNDEBUG  "mex_gateway.cpp"

g++ -O -pthread -shared -Wl,--version-script,/opt/MATLAB/R2013b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -o "mex_gateway.mexa64" mex_gateway.o -L./lib/ -lsharedlib -Wl,-rpath-link,/opt/MATLAB/R2013b/bin/glnxa64 -L/opt/MATLAB/R2013b/bin/glnxa64 -lmx -lmex -lmat -lm

我收到以下错误:

mex_gateway.o: In function `mexFunction':
mex_gateway.cpp:(.text+0x24e): undefined reference to `function_from_library(...arguments...)'
collect2: ld returned 1 exit status

mex: link of ' "mex_gateway.mexa64"' failed.

当然,我对构建命令进行了三次检查,其中包含共享库的正确路径和库名称。共享库确实有函数的定义:

[user@machine]$ nm lib/libsharedlib.so | grep function_from_library
000000000000198a t __function_from_library__FPCdN51dN27iiiiPdPdPdPdPdPdEND
0000000000001360 T function_from_library__FPCdN51dN27iiiiPdPdPdPdPdPd

那么问题出在哪里呢?

编辑:我的 sharedlibraryheader.h 文件如下所示:

#ifndef __SHAREDLIBRARYHEADER_H__
#define __SHAREDLIBRARYHEADER_H__

#ifdef _cplusplus
extern "C"{
#endif

int function1 ( ... );
...
void function_from_library( ... );
...

#ifdef _cplusplus
}
#endif
#endif

最佳答案

您必须执行以下操作:

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

这将使编译器知道在 sharedlibraryheader.h 中定义的函数符合 C ABI 而不是 C++ ABI。通常,这是在 header 本身中按以下方式处理的:

// Typically put headers outside extern "C"
#include "..."
#include "..."

#ifdef __cplusplus
extern "C" {
#endif

... rest of header here ...

#ifdef __cplusplus
}
#endif

在编译时,您必须对使用共享库的代码共享库本身执行此操作。

关于c++ - 从 C 转换为 C++ 后对共享库函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24961475/

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