我在间接链接方面遇到了一些麻烦。这是一个小例子,显示出现了什么问题:
$ make
g++ -fPIC -Wall -c -o main.o main.cpp
g++ -fPIC -Wall -c -o a.o a.cpp
g++ -fPIC -Wall -c -o b.o b.cpp
g++ -fPic -Wall -r -dynamiclib b.o -o libb.dylib
g++ -fPic -Wall -r -dynamiclib a.o -o liba.dylib -L. -lb
LD_LIBRARY_PATH=. g++ main.o -o runme -L. -la -O
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: Undefined symbols:
fooB()
collect2: ld returned 1 exit status
make: *** [runme] Error 1
Makefile
all: runme
CXXFLAGS=-fPIC -Wall
runme: main.o liba.dylib libb.dylib
LD_LIBRARY_PATH=. g++ main.o -o runme -L. -la -O
libb.dylib: b.o
g++ -fPic -Wall -r -dynamiclib b.o -o libb.dylib
liba.dylib: a.o libb.dylib
g++ -fPic -Wall -r -dynamiclib a.o -o liba.dylib -L. -lb
clean:
rm -f *.o *.dylib runme
A.H
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
// liba depends on libb
#include "b.h"
// call through to fooB, implemented in the header.
inline int fooA()
{
return fooB();
}
// call through to barB, implemented in the library.
int barA();
#endif // A_H_INCLUDED
a.cpp
#include "a.h"
int barA()
{
return barB();
}
b.h
#ifndef B_H_INCLUDED
#define B_H_INCLUDED
int fooB();
int barB();
#endif // B_H_INCLUDED
b.cpp
#include "b.h"
int fooB()
{
return 42;
}
int barB()
{
return 314;
}
的main.cpp
#include <iostream>
#include "a.h"
int main()
{
std::cout << barA() << "\n";
std::cout << fooA() << "\n";
return 0;
}
答案 0 :(得分:0)
来自ld man page:
链接两级命名空间时, ld不看间接dylibs, 除非直接再出口 dylibs。另一方面当 链接为平面命名空间,ld确实如此 加载所有间接dylib并使用它们 解决参考资料。
我不是OS X开发人员,但听起来你需要从liba重新导出fooB()或指定-flat_namespace。