2015-09-03 67 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

相關問題