Ошибка компоновщика STD в Apple LLVM 4.1

T как тип должен быть определен в общем экземпляре класса. Следующий пример работает:

public class Test<T> {

    private Map<Class<T>, T> defaultValues;

    public void setDefaultValue(Class<T> clazz, T value) {
        defaultValues.put(clazz, value);
    }

    public T getDefaultValue(Class<T> clazz) {
        return defaultValues.get(clazz);
    }

}

В качестве альтернативы вы можете использовать ответ Павла Томблина и обернуть Map своим собственным объектом, который будет применять этот тип дженериков.

23
задан antho 16 October 2012 в 18:27
поделиться

6 ответов

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

Рассмотрим следующий пример кода:

dhcp-191:~/Development/testy/fred% cat fred.cpp
#include <iostream>
#include <string>
#include "fred.h"

using namespace std;

bool dofred(string &x)
{
    cout << x << endl;
    return true;
}
dhcp-191:~/Development/testy/fred% cat fred.h

#include <iostream>
#include <string>

bool dofred(std::string &x);

dhcp-191:~/Development/testy/fred% clang++ -stdlib=libc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred
0000000000000fa0 T dofred(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
dhcp-191:~/Development/testy/fred% clang++ -stdlib=libstdc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred                     
0000000000000e30 T dofred(std::string&)

Вы получите два совершенно разных экспортированных символа. При попытке использовать символ приложение, которое использует тот же флаг -stdlib, сможет связываться, в то время как приложение, которое не отображает ошибку ссылки.

45
ответ дан Petesh 16 October 2012 в 18:27
поделиться

В iOS 7 я использую библиотеку для диаграмм и имею ту же проблему. В этом случае lib stdc ++ не решает проблему.

Я добавляю stdc ++. 6.dylib к моей фазе сборки, и символы найдены.

46
ответ дан xaxxon 16 October 2012 в 18:27
поделиться

У меня просто была похожая проблема, и мне пришлось перейти в «Настройки сборки», а затем «Apple LLVM 5.1 - Язык - C ++», а затем изменить «Стандартная библиотека C ++» на libstdc ++.

3
ответ дан djacobs7 16 October 2012 в 18:27
поделиться

Вы также можете попробовать добавить пустой файл .cpp в ваш проект. Это обманом заставит xcode загружать стандартные библиотеки C ++

1
ответ дан Lee Irvine 16 October 2012 в 18:27
поделиться

В ответ на джлюканта: у меня была такая же проблема. Я был осторожен, чтобы выбрать правильный ЗППП, но я все еще получил эти ошибки. Но это не ошибка, на самом деле это имеет смысл: зачем XCode ссылаться на c ++ stdlib, если у вас нет кода C ++ в вашем проекте?

Конечно, это проблема, когда вы этого не делаете. есть код C ++ в вашем проекте, но все еще библиотеки C ++.

0
ответ дан user2073196 16 October 2012 в 18:27
поделиться

У меня была эта проблема после помещения всех файлов C ++ в отдельную библиотеку. Я установил настройки всех проектов для использования libc ++, но компоновщик не связывается с libc ++. Если я добавлю файл C ++ в основной проект, проблема исчезнет. Чтобы это исправить, вы можете добавить '-lc ++' в раздел «Другие флаги компоновщика» основного проекта. Это заставит XCode ссылаться на libc ++.

РЕДАКТИРОВАТЬ: Как сказал другой постер, XCode может вести себя правильно. Я ожидал, что он узнает о добавлении связи C ++, потому что исходный код C ++ lib находится в той же рабочей области.

11
ответ дан jlukanta 16 October 2012 в 18:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: