Связать приложение Objective-C со статической библиотекой C ++ - PullRequest
8 голосов
/ 21 января 2012

Я пытаюсь использовать XCode для создания настольного приложения Objective C, которое связывается со статической библиотекой C ++. Я использую Apple Clang компилятор. Я получаю следующую ошибку компоновщика:

Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin11.2.0
Thread model: posix
 "/Developer/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.7.0 -syslibroot /Developer/SDKs/MacOSX10.7.sdk -o /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug/sl marketplace analyitics.app/Contents/MacOS/sl marketplace analyitics -lcrt1.10.6.o -L/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -L/Users/andrew/Projects/sl-marketplace-analysis/platform/mac/sl marketplace analyitics/../../../../../Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -filelist /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Intermediates/sl marketplace analyitics.build/Debug/sl marketplace analyitics.build/Objects-normal/x86_64/sl marketplace analyitics.LinkFileList -framework Cocoa -lcore -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a -F/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug
Undefined symbols for architecture x86_64:
  "std::ios_base::Init::~Init()", referenced from:
      ___cxx_global_var_init in libcore.a(test.o)
  "std::ios_base::Init::Init()", referenced from:
      ___cxx_global_var_init in libcore.a(test.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Похоже, что он не связывается с библиотекой C ++ std. В этом ли проблема, и если да, то как мне убедиться, что она связывается с ней?

Обновление

Если я добавляю пустой файл cpp в сборку, то все компилируется и работает нормально. Мне просто нужен способ сказать компоновщику ссылаться на библиотеку C ++ std. Я попытался просмотреть все настройки сборки в XCode, но не могу найти ничего, что помогло бы.

Ответы [ 4 ]

16 голосов
/ 22 января 2012

Попробуйте добавить -lstdc ++ или -lc ++ (в зависимости от того, какую среду выполнения C ++ ожидает ваша статическая библиотека) в «Другие флаги компоновщика» в разделе «Настройка сборки»:

enter image description here

3 голосов
/ 02 декабря 2014

Имея ту же проблему с Xcode 6, я решил ее, связав " libstdc ++. 6.0.9.dylib " на этапе " Link Binary with Libraries " и добавив -lstdc ++ в " Другие флаги компоновщика " в настройках сборки

1 голос
/ 21 января 2012

Кажется странным, что libcore.a ищет класс с именем Init в пространстве имен std::ios_base.Я не думаю, что std::ios_base::Init является стандартным классом.

Помимо этого, вы можете проверить, что libcore.a на самом деле включает x86_64 код.Вы можете использовать команду file для проверки.Например:

$ file /usr/lib/libz.dylib
/usr/lib/libz.dylib: Mach-O universal binary with 2 architectures
/usr/lib/libz.dylib (for architecture x86_64):  Mach-O 64-bit dynamically linked shared library x86_64
/usr/lib/libz.dylib (for architecture i386):    Mach-O dynamically linked shared library i386

Если вывод команды file не содержит строку «for architecture x86_64», вы не можете использовать библиотеку для создания 64-битного исполняемого файла.

0 голосов
/ 19 ноября 2013

Другие флаги компоновщика -lstdc ++ Не помогло мне в Xcode5. Но найдите аналогичную вещь в Apple LLVM 5.0 - Lnaguage - C ++

значение по умолчанию было libc ++ (стандарт LLVM C ++ ~ blabla) и изменило его на libstdc ++ (вещь GNU)

Теперь нет ошибок при связывании !!! и теперь я должен выяснить, что все работает нормально.

в любом случае спасибо за совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...