dylib动态库调用dylib:体系结构i386的未定义符号

时间:2015-09-03 17:39:55

标签: excel vba gcc g++ dylib

使用gcc-5.2中的g ++在mac os x下我尝试执行以下操作:创建一个dylib,导出由标题tmp8bis_dylib.h和源tmp8bis_dylib.cpp定义的类,然后创建另一个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

显然,我试图分别用-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&#39;(对于mac)VBA,即32位。 / p>

编辑。关注Brett Hale关于Apple's advises about dylibs的评论后,我添加了

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

来自#include的{​​{1}}以及所有成员函数的tmp8bis.cpp之后的

,编译如下:

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

让我的一天。

1 个答案:

答案 0 :(得分: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,我就无法成功。