使用gcc-5.2中的g ++在mac os x下我尝试执行以下操作:创建一个dylib,导出由标题tmp8bis_dylib.h
和源tmp8bis_dylib.cpp
定义的类,然后创建另一个dylib源文件tmp8bis.cpp
使用并链接到前一个dylib。标头和源位于同一目录中。我编译如下:
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将被插入到excel 2011&#39;(对于mac)VBA,即32位。 / p>
编辑。关注Brett Hale关于Apple's advises about dylibs的评论后,我添加了
#define EXPORT __attribute__((visibility("default")))
来自#include
的{{1}}以及所有成员函数的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
让我的一天。
答案 0 :(得分:0)
不诉诸#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
,我就无法成功。