【问题标题】:Objective-C++ file not linking to Cocoa when building library with cmake使用 cmake 构建库时,Objective-C++ 文件未链接到 Cocoa
【发布时间】:2011-10-20 00:59:48
【问题描述】:

我的 API 中有一个目标 c++ 文件。该库构建良好,但是当我编译使用该库的应用程序时,我的所有 Objective-c 调用都会出现链接器错误:

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 lib 构建应用程序时都链接到 cocoa。

这是 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 查找并链接到可可,但它似乎没有这样做。

谢谢

【问题讨论】:

    标签: c++ objective-c cocoa linker cmake


    【解决方案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__ 就没有定义。

    【讨论】:

    • 这在我使用 -ObjC++ 而不是 -x objective-c++ 时有效,并且我将它们插入 CMAKE_SHARED_LINKER_FLAGS 而不是 CMAKE_EXE_LINKER_FLAGS(因为我正在构建一个库)。
    【解决方案2】:

    查看this script,了解如何从命令行链接 Cocoa 应用程序。

    【讨论】:

    • 我需要把它链接到一个静态库。
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多