OSX上的间接链接问题

时间:2009-01-19 15:55:54

标签: macos linker

我在间接链接方面遇到了一些麻烦。这是一个小例子,显示出现了什么问题:

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

1 个答案:

答案 0 :(得分:0)

来自ld man page

  

链接两级命名空间时,   ld不看间接dylibs,   除非直接再出口   dylibs。另一方面当   链接为平面命名空间,ld确实如此   加载所有间接dylib并使用它们   解决参考资料。

我不是OS X开发人员,但听起来你需要从liba重新导出fooB()或指定-flat_namespace。