gpt4 book ai didi

excel - dylib 动态库调用 dylib : Undefined symbols for architecture i386

转载 作者:行者123 更新时间:2023-12-04 21:03:02 26 4
gpt4 key购买 nike

在带有 gcc-5.2 的 g++ 的 mac os x 下,我正在尝试执行以下操作:创建一个 dylib,导出由 header tmp8bis_dylib.h 定义的类和来源 tmp8bis_dylib.cpp , 然后从源文件 tmp8bis.cpp 创建另一个 dylib使用并链接到以前的 dylib。 header 和源位于同一目录中。我编译如下:

g++-5.2.0 -m32 -Wall -g -c ./tmp8bis_dylib.cpp
g++-5.2.0 -m32 -dynamiclib ./tmp8bis_dylib.o -o ./tmp8bis_dylib.dylib
g++-5.2.0 -m32 -Wall -g -c ./tmp8bis.cpp
g++-5.2.0 -m32 -dynamiclib ./tmp8bis.o -o ./tmp8bis.dylib

得到这个:
Undefined symbols for architecture i386:
"complex::cmodule(double, double)", referenced from:
_mymodule in tmp8bis.o
"complex::complex(double, double)", referenced from:
_mymodule in tmp8bis.o
"complex::~complex()", referenced from:
_mymodule in tmp8bis.o
ld: symbol(s) not found for architecture i386
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

显然,我尝试使用 -I 传递各种包含和库路径。和 -L分别标志,结果相同......有什么想法吗?

文件如下:

对于 tmp8bis_dylib.h :
#ifndef TMP_8_BIS_DYLIB_H
#define TMP_8_BIS_DYLIB_H

class complex
{
public:
double real;
double imag;
public:
complex();
complex(double x);
complex(double x,double y);
double cmodule(double x, double y);
~complex();
};

#endif

对于 tmp8bis_dylib.cpp :
#include "./tmp8bis_dylib.h"
#include <math.h>

extern "C"
{
complex::complex()
{
real = 0.0 ;
imag = 0.0 ;
}

complex::complex(double x)
{
real = x ;
imag = 0.0 ;
}

complex::complex(double x,double y)
{
real = x ;
imag = y ;
}

double complex::cmodule(double x, double y)
{
double res = sqrt(x*x+y*y);
return res ;
}

complex::~complex()
{

}
}

对于 tmp8bis.cpp :
#include <math.h>
#include "./tmp8bis_dylib.h"

extern "C"
{
double mymodule(double x, double y)
{
complex z(x,y);
double ret = z.cmodule(x,y);
return ret;
}
}

精确。 -m32是因为我需要 32 位 dylib,因为最终的 dylib 将插入 32 位的 excel 2011 (for mac) VBA。

编辑。 关注 Brett HaleApple's advises about dylibs 的评论, 我加了
#define EXPORT __attribute__((visibility("default")))

#include 之后来自 tmp8bis.cpp , 和 EXPORT的所有成员函数,编译如下:
g++-5.2.0 -m32 -Wall -g -c ./tmp8bis_dylib.cpp
g++-5.2.0 -m32 -dynamiclib ./tmp8bis_dylib.o -fvisibility=hidden -o ./tmp8bis_dylib.dylib

做了 sudo cp ./tmp8bis_dylib.dylib /opt/lib/libtmp8bis_dylib.dylib然后编译:
g++-5.2.0 -m32 -Wall -g -c ./tmp8bis.cpp
g++-5.2.0 -m32 -dynamiclib ./tmp8bis.o -o ./tmp8bis.dylib -L/opt/lib

并得到与以前相同的结果......也没有
g++-5.2.0 -m32 -dynamiclib ./tmp8bis.o -o ./tmp8bis.dylib -ltmp8bis_dylib.dylib

让我开心。

最佳答案

不诉诸#define EXPORT __attribute__((visibility("default")))或任何 -fvisibility=hidden

g++-5.2.0 -m32 -Wall -fpic -g -c ./tmp8bis_dylib.cpp
g++-5.2.0 -m32 -shared ./tmp8bis_dylib.o -o ./libtmp8bis_dylib.dylib
g++-5.2.0 -m32 -Wall -g -c ./tmp8bis.cpp
g++-5.2.0 -m32 -shared ./tmp8bis.o -o ./tmp8bis.dylib -L. -ltmp8bis_dylib

终于奏效了。没有 -fpic,我没有成功, 命名 libtmp8bis_dylib.dylib并使用 -ltmp8bis_dylib .

关于excel - dylib 动态库调用 dylib : Undefined symbols for architecture i386,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382173/

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