如何创建链接以提升

时间:2015-12-11 21:21:34

标签: c++ boost makefile osx-yosemite dylib

我在OSX Yosemite上使用clang并提升1.57。我正在尝试为python应用程序创建一个dylib(使用swig来创建包装器)。我已成功为Windows和Linux编译了此代码,因此我知道OSX上的构建/链接阶段导致了我的问题。这是我的makefile(这是错误的,不知何故):

CC=clang++

vpath %.c ./
vpath %.h ./

SRCS=RecorderLib.cpp RecorderLib_wrap.cpp
OBJS=$(SRCS:.cpp=.o)

LIBS= -lpython2.7 -lboost_iostreams-mt -lboost_system-mt -lboost_thread-mt -lboost_date_time-mt -lboost_chrono-mt -lboost\
_filesystem-mt -lboost_regex-mt -lboost_atomic-mt -lboost_serialization-mt -lboost_program_options-mt


CFLAGS=-arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -pipe -O2 -c -stdlib=libstdc++
LINKFLAGS = -dynamiclib -undefined suppress -flat_namespace

.PHONY: RecorderLib64.dylib

all: RecorderLib_wrap.o RecorderLib.o RecorderLib64.dylib

RecorderLib_wrap.o:
        $(CC) RecorderLib_wrap.cpp $(CFLAGS) $(LIBS) -o RecorderLib_wrap.o

RecorderLib.o:
        $(CC) RecorderLib.cpp $(CFLAGS) $(LIBS) -o RecorderLib.o

RecorderLib64.dylib:
        $(CC) $(LINKFLAGS) $(OBJS) $(LIBS) \                                                                            
        -o RecorderLib64.dylib
        mv RecorderLib64.dylib ../../
clean:
        rm *.o  

如果我删除了-undefined suppress -flat_namespace标记,那么我将引用的所有提升函数都会丢失一百万symbol not found for architecture x86_64个错误。

当我包含这些标志时,库会编译,但是当我启动主机应用程序时,我会收到错误,例如 OSError: dlopen(/Users/myself/RecorderApp/src/RecorderLib64.dylib, 6): Symbol not found: __ZN5boost9iostreams15file_descriptor4seekElSt12_Ios_Seekdir

我认为这意味着dylib并不知道提升。

另一件我不理解但可能相关的事情是,当我编译源对象时,它会抛出我的错误,例如: clang: warning: -lpython2.7: 'linker' input unused

在linux上,你想在编译阶段和链接阶段链接到库(至少这是我的理解 - 无论如何我的Makefile.gnu,我基于这个做了这个并且工作得很漂亮)

我还应该提一下,我可以在这个系统上编译链接到boost和各种dylibs的应用程序,它们工作得很好,所以我知道我的boost安装等没问题。另外,使用file命令检查我链接到的库,告诉我它们是正确的x86_64架构。

随后: 所以,我现在意识到symbol(s) not found for architecture x86_64错误实际上是指向stdlib中的函数(但是从boost中引用),即:

  "std::basic_streambuf<char, std::char_traits<char> >::setbuf(char*, long)", referenced from:
      vtable for boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink, std::char_traits<char>, std::allocator<char>, boost::iostreams::output> in RecorderLib.o

更改makefile以使min osx版本为10.7并使用-stdlib=libc++摆脱所有这些错误,但我仍然获得symbol(s) not found来获得提升:iostreams调用:

  "boost::iostreams::file_descriptor::seek(long,std::__1::ios_base::seekdir)"      

0 个答案:

没有答案