2015-09-03 36 views
2

在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 

让我的一天。

+0

你不能将C++方法封装在'extern“C''中,因为这改变了调用约定 - 或者至少改变了符号的名称。为什么不只为'std :: complex '类使用[''](http://en.cppreference.com/w/cpp/numeric/complex)? –

+0

我应该降低我的“复杂”课程只是一个例子的借口。我怎么能达到我想要的?(顺便说一句,我已经使用dylibs链接到他们,包括他们的头文件,所以我想实现的是可能的,但是,有条件地对你的评论,不可能与我如何做到这一点 –

+0

OS X [动态库](https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html#//apple_ref/doc/uid/TP40001908-SW1)指南 –

回答

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

相关问题