调用dylib的dylibdynamic库:架构i386的未定义符号

在mac os x与g ++从gcc-5.2我试图做到以下几点:创build一个dylib导出tmp8bis_dylib.h文件tmp8bis_dylib.h和源tmp8bis_dylib.cpp定义的类,然后创build另一个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 

显然,我试图通过各自的包括和库path分别与-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评论苹果关于dylibs的build议后 ,我补充道

 #define EXPORT __attribute__((visibility("default"))) 

tmp8bis.cpp包含#include之后,为其所有成员函数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

Interesting Posts