我在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)"