Macos OSX上的间接链接故障

Macos OSX上的间接链接故障,macos,linker,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.

我在间接链接方面遇到了一些问题。下面是一个小示例,说明了问题所在:

$ 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
生成文件

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

a、 cpp

b、 h

b、 cpp

main.cpp

#include <iostream>

#include "a.h"

int main()
{
        std::cout << barA() << "\n";
        std::cout << fooA() << "\n";
        return 0;
}
#包括
#包括“a.h”
int main()
{
标准::cout来自:

链接两级命名空间时, ld不看间接动态库, 除非通过直接出口重新出口 另一方面,当 为平面名称空间链接,ld 加载所有间接动态库并使用它们 解析引用

我不是OSX开发人员,但听起来您要么需要从liba重新导出fooB(),要么指定-flat_名称空间

#include "a.h"

int barA()
{
        return barB();
}
#ifndef B_H_INCLUDED
#define B_H_INCLUDED

int fooB();

int barB();

#endif // B_H_INCLUDED
#include "b.h"

int fooB()
{
        return 42;
}

int barB()
{
        return 314;
}  
#include <iostream>

#include "a.h"

int main()
{
        std::cout << barA() << "\n";
        std::cout << fooA() << "\n";
        return 0;
}