2011-10-20 11 views
0

私のAPIには、目的のC++のファイルがあります。ライブラリは、罰金のビルドが、私は、ライブラリを使用するアプリケーションをコンパイルするために行くとき、私はすべての私のObjective-Cの呼び出しのためのリンカエラーを取得:Objective-C++ファイルがcmakeでライブラリをビルドするときにCocoaにリンクしていません

Undefined symbols: 
    "_objc_msgSend", referenced from: 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::paste()  in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::paste()  in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::paste()  in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::paste()  in libAgui.a(OSXClipboard.mm.o) 
    (maybe you meant: l_objc_msgSend_fixup_release, l_objc_msgSend_fixup_alloc) 
    "_NSPasteboardTypeString", referenced from: 
     agui::OSXClipboard::paste()  in libAgui.a(OSXClipboard.mm.o) 
    "_OBJC_CLASS_$_NSArray", referenced from: 
     objc-class-ref-to-NSArray in libAgui.a(OSXClipboard.mm.o) 
    "_OBJC_CLASS_$_NSString", referenced from: 
     objc-class-ref-to-NSString in libAgui.a(OSXClipboard.mm.o) 
    "_objc_msgSend_fixup", referenced from: 
     l_objc_msgSend_fixup_alloc in libAgui.a(OSXClipboard.mm.o) 
     l_objc_msgSend_fixup_release in libAgui.a(OSXClipboard.mm.o) 
    (maybe you meant: l_objc_msgSend_fixup_release, l_objc_msgSend_fixup_alloc) 
    "_OBJC_CLASS_$_NSAutoreleasePool", referenced from: 
     objc-class-ref-to-NSAutoreleasePool in libAgui.a(OSXClipboard.mm.o) 
    "_NSStringPboardType", referenced from: 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
     agui::OSXClipboard::copy(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in libAgui.a(OSXClipboard.mm.o) 
    "_OBJC_CLASS_$_NSPasteboard", referenced from: 
     objc-class-ref-to-NSPasteboard in libAgui.a(OSXClipboard.mm.o) 
ld: symbol(s) not found 

私の目標はココアに私が構築するたびにリンクする必要がないことですが私のGUIライブラリとアプリ。ここで

はcmakeのファイルです:

cmake_minimum_required(VERSION 2.6) 

project(agui) 

OPTION(WANT_SHARED "Build agui and the backend as a shared library" OFF) 

OPTION(WANT_ALLEGRO5_BACKEND "Build the Allegro 5 backend" ON) 

if(APPLE AND NOT IPHONE) 
    set(MACOSX 1) 
endif(APPLE AND NOT IPHONE) 

if(MACOSX) 
ADD_DEFINITIONS("-x objective-c++") 
endif(MACOSX) 

if(MACOSX) 
find_library(COCOA_LIBRARY Cocoa) 
endif(MACOSX) 

set(CLIPBOARD_SOURCE) 

if(WIN32) 
set(CLIPBOARD_SOURCE src/Agui/Clipboard/WinClipboard.cpp) 
endif(WIN32) 

if(MACOSX) 
set(CLIPBOARD_SOURCE src/Agui/Clipboard/OSXClipboard.mm) 
endif(MACOSX) 


set(AGUI_SOURCES 
    ${CLIPBOARD_SOURCE} 
    src/Agui/Clipboard/Clipboard.cpp 
    src/Agui/ActionEvent.cpp 
    src/Agui/ActionListener.cpp 
    src/Agui/BaseTypes.cpp 
    src/Agui/BlinkingEvent.cpp 
    src/Agui/BorderLayout.cpp 
    src/Agui/Color.cpp 
    src/Agui/Dimension.cpp 
    src/Agui/EmptyWidget.cpp 
    src/Agui/EventArgs.cpp 
    src/Agui/FlowLayout.cpp 
    src/Agui/FocusListener.cpp 
    src/Agui/FocusManager.cpp 
    src/Agui/Font.cpp 
    src/Agui/FontLoader.cpp 
    src/Agui/Graphics.cpp 
    src/Agui/GridLayout.cpp 
    src/Agui/Gui.cpp 
    src/Agui/Image.cpp 
    src/Agui/ImageLoader.cpp 
    src/Agui/Input.cpp 
    src/Agui/KeyboardListener.cpp 
    src/Agui/Layout.cpp 
    src/Agui/MouseListener.cpp 
    src/Agui/Point.cpp 
    src/Agui/Rectangle.cpp 
    src/Agui/ResizableText.cpp 
    src/Agui/ResizableBorderLayout.cpp 
    src/Agui/SelectionListener.cpp 
    src/Agui/TopContainer.cpp 
    src/Agui/Widget.cpp 
    src/Agui/WidgetListener.cpp 
    src/Agui/Widgets/Button/Button.cpp 
    src/Agui/Widgets/Button/ButtonListener.cpp 
    src/Agui/Widgets/CheckBox/CheckBox.cpp 
    src/Agui/Widgets/CheckBox/CheckBoxListener.cpp 
    src/Agui/Widgets/DropDown/DropDown.cpp 
    src/Agui/Widgets/DropDown/DropDownListener.cpp 
    src/Agui/Widgets/Frame/Frame.cpp 
    src/Agui/Widgets/Frame/FrameListener.cpp 
    src/Agui/Widgets/Label/Label.cpp 
    src/Agui/Widgets/Label/LabelListener.cpp 
    src/Agui/Widgets/ListBox/ListBox.cpp 
    src/Agui/Widgets/ListBox/ListBoxListener.cpp 
    src/Agui/Widgets/RadioButton/RadioButton.cpp 
    src/Agui/Widgets/RadioButton/RadioButtonListener.cpp 
    src/Agui/Widgets/RadioButton/RadioButtonGroup.cpp 
    src/Agui/Widgets/ScrollBar/HScrollBar.cpp 
    src/Agui/Widgets/ScrollBar/HScrollBarListener.cpp 
    src/Agui/Widgets/ScrollBar/VScrollBar.cpp 
    src/Agui/Widgets/ScrollBar/VScrollBarListener.cpp 
    src/Agui/Widgets/ScrollPane/ScrollPane.cpp 
    src/Agui/Widgets/Slider/Slider.cpp 
    src/Agui/Widgets/Slider/SliderListener.cpp 
    src/Agui/Widgets/Tab/Tab.cpp 
    src/Agui/Widgets/Tab/TabbedPane.cpp 
    src/Agui/Widgets/Tab/TabbedPaneListener.cpp 
    src/Agui/Widgets/TextBox/TextBox.cpp 
    src/Agui/Widgets/TextBox/TextBoxListener.cpp 
    src/Agui/Widgets/TextBox/ExtendedTextBox.cpp 
    src/Agui/Widgets/TextField/TextField.cpp 
    src/Agui/Widgets/TextField/TextFieldListener.cpp 
    ) 

set(ALLEGRO5_BACKEND_SOURCES 
    src/Agui/Backends/Allegro5/Allegro5Font.cpp 
    src/Agui/Backends/Allegro5/Allegro5FontLoader.cpp 
    src/Agui/Backends/Allegro5/Allegro5Graphics.cpp 
    src/Agui/Backends/Allegro5/Allegro5Image.cpp 
    src/Agui/Backends/Allegro5/Allegro5ImageLoader.cpp 
    src/Agui/Backends/Allegro5/Allegro5Input.cpp 
    ) 

    include_directories (./include) 
if(WANT_SHARED) 
    add_library(agui SHARED ${AGUI_SOURCES}) 

    if(MACOSX) 
    target_link_libraries (agui ${COCOA_LIBRARY}) 
    endif(MACOSX) 

    set_target_properties(agui PROPERTIES DEFINE_SYMBOL "AGUI_BUILD") 
    if(WANT_ALLEGRO5_BACKEND) 
    add_library(agui_allegro5 SHARED ${ALLEGRO5_BACKEND_SOURCES}) 
    set_target_properties(agui_allegro5 PROPERTIES DEFINE_SYMBOL "AGUI_BACKEND_BUILD") 
    target_link_libraries (agui_allegro5 agui) 
    endif() 
else() 
    add_library(agui STATIC ${AGUI_SOURCES}) 

    if(MACOSX) 
    target_link_libraries (agui ${COCOA_LIBRARY}) 
    endif(MACOSX) 

    if(WANT_ALLEGRO5_BACKEND) 
    add_library(agui_allegro5 STATIC ${ALLEGRO5_BACKEND_SOURCES}) 
    set_target_properties(agui_allegro5 PROPERTIES COMPILE_DEFINITIONS "ALLEGRO_STATICLINK") 
    endif() 
endif() 

私が見つけ、ココアにリンクするcmakeのを言っているが、それを行うにはいないようです。

おかげ

答えて

-2

は、コマンドラインからのCocoaアプリをリンクする方法についてはthis scriptを見てみましょう。

+0

静的ライブラリにリンクする必要があります。 – jmasterx

1

objective-C++アプリケーションもコンパイルするとリンカーエラーが発生しました。これを私のCMakeLists.txtに追加する必要がありました: add_definitions("-x objective-c++") # as you already have set(CMAKE_EXE_LINKER_FLAGS "-framework ServiceManagement -framework Foundation -framework Cocoa") これがなければ、__OBJC__は定義されませんでした。

+0

これは、 '-x objective-C++'の代わりに '-ObjC++'を使ったときに動作し、CMAKE_EXE_LINKER_FLAGSの代わりにCMAKE_SHARED_LINKER_FLAGSにプラグインしました(私がライブラリをビルドして以来)。 –

関連する問題