调用 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
的#include
和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
得到了和以前一样的结果...也没有
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
.
,我没有成功
在 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
的#include
和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
得到了和以前一样的结果...也没有
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
.