2012-02-09 4 views
7

У меня есть библиотека C++, на которую ссылается проект Objective-C++. Библиотека компилируется сама по себе, а проект Objective-C++ компилируется до тех пор, пока я не создам первый класс из библиотеки (используя указатель на объект). Перед использованием класса из моей библиотеки у меня были ссылки на stl string объекты, которые не вызывали проблем.Ошибки при кросс-компиляции C++/Objective-C++

Я получаю следующие ошибки:

Undefined symbols for architecture i386: 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
     __verify_callback_c in *************.a(cxx_db.o) 
     DbEnv::_stream_message_function(__db_env const*, char const*) in *************.a(cxx_env.o) 
     DbEnv::_stream_error_function(__db_env const*, char const*, char const*) in *************.a(cxx_env.o) 
    "std::basic_ios<char, std::char_traits<char> >::fail() const", referenced from: 
     __verify_callback_c in *************.a(cxx_db.o) 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_db.o) 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_dbc.o) 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_dbt.o) 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_env.o) 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_mpool.o) 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_txn.o) 
     __static_initialization_and_destruction_0(int, int) in *************.a(cxx_lock.o) 
     ... 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in *************.a(cxx_db.o) 
     ___tcf_0 in *************.a(cxx_dbc.o) 
     ___tcf_0 in *************.a(cxx_dbt.o) 
     ___tcf_0 in *************.a(cxx_env.o) 
     ___tcf_0 in *************.a(cxx_mpool.o) 
     ___tcf_0 in *************.a(cxx_txn.o) 
     ___tcf_0 in *************.a(cxx_lock.o) 
     ... 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

До сих пор я обнаружил, что ошибки, как они могут быть вызваны следующими причинами:

  1. Имея тип файла ого вместо. мм
  2. Создание C++ объект в моей Objective-C++ без использования указателя

Я предполагаю, что это сом e вид ошибки кросс-компиляции, но я не знаю, где искать. Идеи о том, что это может быть?

EDIT:

Build Settings: 
C++ Standard Library = libc++ 
C++ Language Dialect = c++0x 

Это в моем проекте верхнего уровня. Также используется библиотека, содержащаяся в ней, (она также ссылается на внешнюю библиотеку, а путь заголовка больше не найден при добавлении его в мой основной проект - мне пришлось добавить его в мои основные настройки проекта).

Edit 2: Вот шаг сборки, которая не:

Ld/Users/пользователя/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator. приложение/BerkeleyDBHelloWorldSimulator нормальный i386 кд/Users/пользователя/Документы/Проекты/тесты/BerkeleyDBHelloWorldSimulator SETENV MACOSX_DEPLOYMENT_TARGET 10,6 SetEnv PATH «/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin :/usr/bin:/bin:/usr/sbin:/sbin " /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang++ -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk -L/Пользователи/пользователь/Библиотека/Разработчик/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator -F/Users/пользователя/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Продукты/Debug-iphonesimulator -filelist/Пользователи/пользователя /Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Intermediates/BerkeleyDBHelloWorldSimulator.build/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.build/Objects-normal/i386/BerkeleyDBHelloWorldSimulator.LinkFileList -mmacosx-версия-10 мин = , 6 -Xlinker -objc_abi_version -Xlinker 2 -stdlib = LibC++ -Xlinker -no_implicit_dylibs -D__IPHONE_OS_VERSION_MIN_REQUIRED = 50000 -lstdC++/Users/пользователя/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/libBerkeleyDB .a -framework UIKit -framework Foundation -framework CoreGraphics -o/Users/пользователь/Библиотека/Разработчик/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.app/BerkeleyDBHelloWorldSimulator

+0

Это не все ошибки, это поможет процитировать их. Они выглядят как ошибки ссылок, а не компилируют ошибки, но вы уверены, что вы связываетесь с стандартной библиотекой C++? (libstdC++. dylib) – pmdj

+0

Единственное, что я урезал, это имя библиотеки. Это статическая библиотека, хотя и не dylib (я компилирую для iOS). – mydogisbox

+0

Должно быть что-то * над * строками, на которые ссылаются ссылки, которые сообщают вам фактическую ошибку. (Я до сих пор подозреваю ошибку связи) Возникает ли ошибка при связывании вашей библиотеки или общего проекта? Связана ли ваша библиотека с libstdC++ или вашим приложением? Или оба? – pmdj

ответ

8

Потребовалось некоторое время, чтобы добраться до чего-то приближающегося решение в комментариях нить, так что я собираюсь подвести его здесь:

Этот тип ошибки вызывается не успешной связи с правильной libstdc++.dylib, стандартная библиотека C++. Иногда вы забываете добавить его, иногда XCode путается.

Прежде всего, убедитесь, что вы действительно связываетесь с ним в настройках целевой цели приложения: он должен появляться в «фазах сборки», «связывать двоичные файлы с библиотеками».

Если он есть, но все еще не связан, проверьте журнал необработанной сборки на наличие любых предупреждений, которые XCode может скрывать от вас: например, о неправильной архитектуре. Это означает, что вы ссылаетесь на неправильную версию файла - например, связывание с симулятором или версией OSX, а не с каталогом iPhoneOSx.y.sdk. Раньше, с XCode 3, это было действительно легко ошибиться, и единственный способ исправить это - попробовать каждый отдельный libstdc++.dylib, который предлагал XCode до тех пор, пока он не работал. XCode4 обычно предлагает только один, в дополнение к именам с номерами версий. Обычно вы выбираете dylib без номера версии.

Убедитесь, что все подпроекты, которые могут быть связаны с libstdc++.dylib, используют ту же версию в том же месте.

Проверьте «Пути поиска в библиотеке» и «Пути поиска по Карте» для любых путей, которые вы не добавили. У меня были XCode заданные пути к старым SDK здесь, которые путали компоновщик.

Наконец, иногда это помогает просто удалить ссылку на libstdc++.dylib, очистить проект, выйти и перезапустить XCode и повторно добавить ссылку.

+0

Хороший полный ответ. – mydogisbox

+1

Я перепробовал свои библиотеки, и получается libstdC++. Dylib - это ссылка на libstdC++. 6.dylib, который является ссылкой на libstdC++. 6.0.9.dylib, поэтому возможно, что xcode не знает, как разрешить 2 уровня косвенности. – mydogisbox

+0

Обычно он может обрабатывать 2 уровня символической ссылки. Все, о чем я могу думать, это то, что на самом деле он смотрит на файл с тем же именем в другом каталоге. Связывание с libstdC++. 6 - это вполне приемлемое решение, поэтому идите с этим. – pmdj

3

Убедитесь, что оба кода и библиотеки связаны с одной и той же стандартной библиотекой C++.

+0

Я думаю, что они делают. Мой проект библиотеки находится внутри моего другого проекта, и я понимаю, что в этом случае библиотека использует настройки в основном проекте. – mydogisbox

Смежные вопросы