在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)指南 –