OSX使用SCons建设共享库:用于建筑x86_64的未定义符号

问题描述:

字幕:建筑的OpenCV和DLIB与x86_64的Mac OSX上的El队长SCons的OSX使用SCons建设共享库:用于建筑x86_64的未定义符号

我一直试图让我的应用程序建立在交叉:对建筑x86_64的未定义符号平台。

我有一个SCons脚本,目前在Windows上构建良好,但它无法在Mac中构建。

我相信这是由于与更新版本的XCode发生冲突而导致的,因为我的代码和scons的某些以前版本很好地工作(在重构之前)。

以下是错误消息,我认为这很常见,但我似乎找不到解决方法。

在OpenCV2-highgui,cap_avfoundation.mm

Undefined symbols for architecture x86_64: 
    "_AVCaptureSessionPresetMedium", referenced from: 
     CvCaptureCAM::startCaptureDevice(int) in libOpencvHighgui.a(cap_avfoundation.o) 
    "_AVFileTypeAppleM4V", referenced from: 
     CvVideoWriter_AVFoundation::CvVideoWriter_AVFoundation(char const*, int, double, CvSize, int) in libOpencvHighgui.a(cap_avfoundation.o) 
    "_AVFileTypeMPEG4", referenced from: 
     CvVideoWriter_AVFoundation::CvVideoWriter_AVFoundation(char const*, int, double, CvSize, int) in libOpencvHighgui.a(cap_avfoundation.o) 
    "_AVFileTypeQuickTimeMovie", referenced from: 
     CvVideoWriter_AVFoundation::CvVideoWriter_AVFoundation(char const*, int, double, CvSize, int) in libOpencvHighgui.a(cap_avfoundation.o) 
    "_AVMediaTypeVideo", referenced from: 
     CvCaptureCAM::startCaptureDevice(int) in libOpencvHighgui.a(cap_avfoundation.o) 
     CvCaptureFile::CvCaptureFile(char const*) in libOpencvHighgui.a(cap_avfoundation.o) 
     CvVideoWriter_AVFoundation::CvVideoWriter_AVFoundation(char const*, int, double, CvSize, int) in libOpencvHighgui.a(cap_avfoundation.o) 

... ... ...

在OpenCV2-highgui,window_cocoa.mm

"_OBJC_CLASS_$_NSSlider", referenced from: 
     objc-class-ref in libOpencvHighgui.a(window_cocoa.o) 
    "_OBJC_CLASS_$_NSString", referenced from: 
     objc-class-ref in libOpencvHighgui.a(window_cocoa.o) 
     objc-class-ref in libOpencvHighgui.a(cap_avfoundation.o) 
    "_OBJC_CLASS_$_NSTextField", referenced from: 
     objc-class-ref in libOpencvHighgui.a(window_cocoa.o) 
    "_OBJC_CLASS_$_NSThread", referenced from: 
     objc-class-ref in libOpencvHighgui.a(window_cocoa.o) 
    "_OBJC_CLASS_$_NSURL", referenced from: 

。 ... ... ...

除了建筑OpenCV的,在dlib_18_14发生同样的错误,source.cpp

"_XAllocColor", referenced from: 
     void nativefont::font_renderer::font_renderer::vals_internal::create<unsigned int>(unsigned int*, int, bool, bool, bool, nativefont::font_renderer::font_renderer::rgb_type, nativefont::font_renderer::font_renderer::rgb_type) in libThirdPartyDlib_18_14.a(source.o) 
    "_XAllocSizeHints", referenced from: 
     dlib::base_window::set_size(int, int) in libThirdPartyDlib_18_14.a(source.o) 
     dlib::base_window::base_window(bool, bool) in libThirdPartyDlib_18_14.a(source.o) 
     dlib::gui_core_kernel_2_globals::event_handler_thread::event_handler() in libThirdPartyDlib_18_14.a(source.o) 
    "_XChangeProperty", referenced from: 
     dlib::gui_core_kernel_2_globals::event_handler_thread::event_handler() in libThirdPartyDlib_18_14.a(source.o) 
    "_XCheckIfEvent", referenced from: 
     dlib::gui_core_kernel_2_globals::event_handler_thread::event_handler() in libThirdPartyDlib_18_14.a(source.o) 
    "_XClearArea", referenced from: 
     dlib::base_window::invalidate_rectangle(dlib::rectangle const&) in libThirdPartyDlib_18_14.a(source.o) 
    "_XCloseDisplay", referenced from: 
     nativefont::font_renderer::font_renderer::vals_internal::~vals_internal() in libThirdPartyDlib_18_14.a(source.o) 
     dlib::gui_core_kernel_2_globals::event_handler_thread::~event_handler_thread() in libThirdPartyDlib_18_14.a(source.o) 
    "_XCloseIM", referenced from: 
     dlib::gui_core_kernel_2_globals::event_handler_thread::~event_handler_thread() in libThirdPartyDlib_18_14.a(source.o) 
    "_XConvertSelection", referenced from: 
     dlib::get_from_clipboard(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&) in libThirdPartyDlib_18_14.a(source.o) 
    "_XCreateFontSet", referenced from: 
     dlib::base_window::base_window(bool, bool) in libThirdPartyDlib_18_14.a(source.o) 
     void nativefont::font_renderer::font_renderer::vals_internal::create<unsigned int>(unsigned int*, int, bool, bool, bool, nativefont::font_renderer::font_renderer::rgb_type, nativefont::font_renderer::font_renderer::rgb_type) in libThirdPartyDlib_18_14.a(source.o) 

... ... ...

和错误归纳为以下几点:

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
scons: *** [out/darwin/x86_64/release/1.0.0/bin/libAPI3dfi_api_v1.dylib] Error 1 
scons: building terminated because of errors. 

我不能在这里公开整个源代码和scons构建脚本,所以请介意。

这是我scons的脚本看起来像建立一个共享库(生成静态库都没有问题,只是共享库)的示例代码段:

Import('env') 

# Add third party libraries 
lib_env = env.Clone() 
module_lib_env = lib_env.Clone() 
target_os = env.get('TARGET_OS') 
target_arch = env.get('TARGET_ARCH') 


###################################################################### 
# Runtime Dependencies 
###################################################################### 
pthread_path = env.get('PTHREAD_PATH') + '/lib' 
intraface_path = env.get('INTRAFACE_PATH') + '/lib' 

###################################################################### 
# General flags 
###################################################################### 
module_lib_env.AppendUnique(CPPPATH = ['inc', 'src']) 

###################################################################### 
# Libraries 
###################################################################### 
module_lib_env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')+'/bin',env.get('BUILD_DIR')+'/lib', pthread_path, intraface_path]) 

if target_os == 'windows': 
    module_lib_env.AppendUnique(LIBS = [ 
           'libOpencvCore', 
           'libOpencvHighgui', 
           'libOpencvImgproc', 
           'libOpencvObjdetect', 
           'libOpencvFlann', 
           'libOpencvFeature2d', 
           'libOpencvVideo', 
           'libOpencvCalib3d', 
           'libOpencvMl', 
           'libFreeimage', 
           'libFreeimageOpenEXR', 
           'libFreeimageLibTIFF', 
           #'libFreeimageLibRawLite', 
           'libFreeimageLibPNG', 
           'libFreeimageLibOpenJPEG', 
           'libFreeimageLibJPEG', 
           'libFreeimageLibMNG', 
           'libFreeimageZLib', 
           'libThirdPartyDlib_18_14', 
           'pthread', 
           'IntraFaceDLL']) 
else: 
    module_lib_env.AppendUnique(LIBS = [ 
           'libOpencvCore', 
           'libOpencvHighgui', 
           'libOpencvImgproc', 
           'libOpencvObjdetect', 
           'libOpencvFlann', 
           'libOpencvFeature2d', 
           'libOpencvVideo', 
           'libOpencvCalib3d', 
           'libOpencvMl', 
           'libFreeimage', 
           'libFreeimageOpenEXR', 
           'libFreeimageLibTIFF', 
           #'libFreeimageLibRawLite', 
           'libFreeimageLibPNG', 
           'libFreeimageLibOpenJPEG', 
           'libFreeimageLibJPEG', 
           'libFreeimageLibMNG', 
           'libFreeimageZLib', 
           'libThirdPartyDlib_18_14', 
           'pthread' 
           # ,'IntraFaceDLL' 
           ]) 


###################################################################### 
# Preprocessor flags 
###################################################################### 
if not target_os == 'windows': 
    #allow error to be concidered as warning 
    module_lib_env.AppendUnique(CCFLAGS = ['-fpermissive']) 
    #disable warning 
    module_lib_env.AppendUnique(CCFLAGS = ['-Wno-sign-compare']) 
    module_lib_env.AppendUnique(CCFLAGS = ['-Wno-write-strings']) 
    module_lib_env.AppendUnique(CCFLAGS = ['-Wno-unused-variable']) 
if target_os in ['darwin', 'ios']: 
    module_lib_env.AppendUnique(CPPDEFINES = ['_LIBCPP_HAS_NO_VARIADICS']) 

###################################################################### 
# Source files and Targets 
###################################################################### 
lib_src = env.Glob('src/*.cpp') 

###################################################################### 
# Targets 
###################################################################### 
module_lib_env.InstallTargetShared('libOpenCV', lib_src) 

这里是Full error log.

这里是InstallTargetShared的样子:

def __install_shared(ienv, name, srcs): 
    ienv.SharedLibrary(target = os.path.join(env.get('BUILD_DIR') +'/bin/', name), source = srcs) 
    env.AppendUnique(TS = [name]) 

env.AddMethod(__install_shared, 'InstallTargetShared') 

任何帮助或在这件事情做什么意见我们将不胜感激!

+0

什么是“InstallTargetShared”? – bdbaddog

+0

@bdbaddog InstallTargetShared是一个用于创建共享库的自定义函数,它可以在Windows上正常工作。 –

+0

如果你不能在这里发布你的源代码,最简单的方法是创建一个最小工作示例(MWE),然后用它来提问你的问题。否则,我们将无法正确调试您的问题... – dirkbaechle

查看完整的构建日志,我认为您需要链接几个OSX框架来解决您的问题。我没有看到你的链接命令行中有任何内容:

g++ -o out/darwin/x86_64/release/1.0.0/bin/libAPI3dfi_api_v1.dylib -ldl -lpthread -mmacosx-version-min=10.11 -DWITH_OPENEXR=OFF -dynamiclib out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Api.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_App_Manager.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_App_Params.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_App_Retry.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Device_Heartbeat.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Device_Init.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Frame_Stats.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Manager.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Session_Assign.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Session_End.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/NV3DFI_Event_Session_Start.os out/darwin/x86_64/release/1.0.0/src/api/3dfi_api_v1/src/SHA1Hash.os -L/usr/local/lib -L/opt/local/lib -Ldeps/darwin/lib/x86_64 -Lout/darwin/x86_64/release/1.0.0 -L. -Lout/darwin/x86_64/release/1.0.0/bin -Lbin -Lout/darwin/x86_64/release/1.0.0/lib -Llib -L/Users/tllewellynn/Desktop/dev/build_scons/runtime/darwin/xcode/x86_64/pthread/lib -L/Users/tllewellynn/Desktop/dev/build_scons/runtime/darwin/xcode/x86_64/intraface/lib -lSDK3dfi_detect -lSDK3dfi_algo -lSDK3dfi_au -lSDK3dfi_align -lSDK3dfi_proc -lSDK3dfi_cluster -lSDK3dfi_attr -lSDK3dfi_type -lOpencvCore -lOpencvHighgui -lOpencvImgproc -lOpencvObjdetect -lOpencvFlann -lOpencvFeature2d -lOpencvVideo -lOpencvCalib3d -lOpencvMl -lFreeimage -lFreeimageOpenEXR -lFreeimageLibTIFF -lFreeimageLibPNG -lFreeimageLibOpenJPEG -lFreeimageLibJPEG -lFreeimageLibMNG -lFreeimageZLib -lFrameworkNvaam_base -lFrameworkNvaam_filter -lFrameworkNvaam -lFrameworkProtobuf -lFrameworkLibbff -lFrameworkNvclassifier -lFrameworkNvexpression -lFrameworkTrimesh2 -lFrameworkPolyfit -lFrameworkGClasses -lFrameworkFlandmark -lFrameworkAlglib -lNetMsgpack -lNetJsoncpp -lNetTinyxml2 -lNetTinyxmlparam -lCnnEblearnTools -lCnnEblearnIdx -lCnnEblearn -lThirdPartyDlib_18_14 -lSystemTinycthread -lSystemTinythread -lSystemGlobal -lSystemDebug -lpthread -lTbb -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/ 

你问过任何openCV论坛或IRC频道吗?

看起来你缺少链接线中的几个关键框架。

+0

问题解决了,谢谢你的帮助! –

+0

我只需将它链接到CoreMedia和CoreVideo等OpenCV链接问题的一些框架。 –

+1

关于dlib,我在它的Github存储库中发布了一个问题,并发现我需要链接到X11。 –