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