调用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
。