在mac os x与g ++从gcc-5.2我尝试执行以下操作:创建一个dylib导出由标头tmp8bis_dylib.h
和源tmp8bis_dylib.cpp
定义的类,然后创建源文件tmp8bis.cpp
中的另一个dylib使用并链接到前一个dylib。标题和来源位于相同的目录中。我编译如下:dylib动态库调用dylib:未定义的符号体系结构i386
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(for mac)VBA中,这是32位。
编辑。继Brett Hale的评论有关Apple's advises about dylibs,我加
#define EXPORT __attribute__((visibility("default")))
的#include
后“从tmp8bis.cpp
s和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
a nd得到了和以前一样的结果...也没有
g++-5.2.0 -m32 -dynamiclib ./tmp8bis.o -o ./tmp8bis.dylib -ltmp8bis_dylib.dylib
让我的一天。
你不能将C++方法封装在'extern“C''中,因为这改变了调用约定 - 或者至少改变了符号的名称。为什么不只为'std :: complex'类使用[''](http://en.cppreference.com/w/cpp/numeric/complex)? –
我应该降低我的“复杂”课程只是一个例子的借口。我怎么能达到我想要的?(顺便说一句,我已经使用dylibs链接到他们,包括他们的头文件,所以我想实现的是可能的,但是,有条件地对你的评论,不可能与我如何做到这一点 –
OS X [动态库](https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html#//apple_ref/doc/uid/TP40001908-SW1)指南 –