调用 dylib 的 dylib 动态库:架构 i386 的未定义符号

dylib dynamic library calling a dylib : Undefined symbols for architecture i386

在 mac os x 和 gcc-5.2 的 g++ 下,我正在尝试执行以下操作:创建一个 dylib 导出由 header [=] 定义的 class 19=] 和 source tmp8bis_dylib.cpp,然后使用并链接到前一个 dylib 从源文件 tmp8bis.cpp 创建另一个 dylib。 Header 和源在同一目录中。我编译如下:

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;
      }
}

Precision. -m32 是因为我需要 32 位的 dylib,因为最终的 dylib 将插入 excel 2011 的(对于 mac )VBA,也就是32位。

编辑。Brett Hale's comment about Apple's advises about dylibs 之后,我添加了

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

tmp8bis.cpp#includeEXPORT的所有成员函数之后,编译如下:

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.

,我没有成功