2012-04-26 14 views
14

Otrzymuję include nie znaleziono błąd kompilacji w XCode. Mam projekt aplikacji na iOS, w której używam Objective-c i C++ jako mix.Zawiera <string> nie znaleziono błąd kompilacji w Xcode 4.2

Początkowo utworzyłem jeden plik .h i jeden plik .cpp w moim projekcie ios. Następnie zmieniłem nazwę pliku .cpp na plik .mm.

Oto mój plik .h;

TestLog.h

#ifndef CalculatorDemo_TestLog_h 
#define CalculatorDemo_TestLog_h 
#include <string> 
using namespace std; 

class TestLog 
{ 
private: 
    string logString; 
public: 
    void Log(string logMessage); 
}; 


#endif 

TestLog.mm

#include "TestLog.h" 

void TestLog::Log(string logMessage) 
{ 
    //this->logString->append(logMessage); 

} 

Czego mi brakuje? Czy muszę dodać bibliotekę std C++ do moich urządzeń docelowych? Coś związanego z Ścieżkami nagłówka wyszukiwania?

Po prostu potrzebuję użyć typu łańcucha.

Wielkie dzięki z góry

+0

Z pewnością wygląda na to, że * powinien * działać ... Ale czy jest jakiś powód, dla którego nie używasz 'NSString' zamiast? –

+0

wygląda tak, jak XCode domyślnie nie zawiera ścieżek std, myślę, że musisz to zrobić ręcznie. Unikaj także używania plików .hh w pliku implementacji lub nie używaj go w ogóle. – AlexTheo

Odpowiedz

4
+0

Dla aplikacji wymagających kodu C++ (i standardowych bibliotek C++), należy to przeczytać! Raczej trudno znaleźć tę odpowiedź, ale cholera, pomogła mi nie raz! Dzięki! : D – javatarz

+1

Niektóre opisy problemu byłyby mile widziane w tym wątku. – AbiusX

+1

Proszę odpowiedzieć na pytanie w swojej odpowiedzi, zamiast umieszczać link, który może zostać zniszczony na forum z wieloma (niektórymi bezużytecznymi) odpowiedziami. –

1

Uważam, że należy podać całą ścieżkę do biblioteki. podobnie jak w przypadku frameworków "fundacja" & "uiview".

#import <Foundation/Foundation.h> 

lub

#import <UIKit/UIKit.h> 

i tak, upewnij się dodać bibliotekę do celu.

5

wybierz projekt -> budować ustawienie -> jabłko LLVM kompilator 5.1 -> język

W Compile Sources As zmiany Objective-C++

2

Jest dziwactwo w XCode. Zauważyłem to w 7.3. Większość projektów rozpoznaje pliki .mm i STL, podczas gdy jeden projekt nie miał. Poprawka polegała na tym, że musiałem kliknąć ikonę lewego górnego projektu, a następnie kliknąć Obiekty docelowe> Fazy budowy> Link Binary z bibliotekami> i dodać AppKit.framework. Następnie musiałem kliknąć Obiekty docelowe> Ustawienia kompilacji> Wyszukaj w "Źródłach kompilacji" i ustawić na "Obiektywne C++" we wszystkich możliwych kolumnach. Następnie wybierz polecenie Wyczyść, a następnie opcję Kompilacja z menu Produkt. Zostało to odpowiednio skompilowane. Następnie ponownie wróć do tych źródeł kompilacji i ustaw ponownie na "Według typu pliku" we wszystkich możliwych kolumnach. Następnie ponownie kliknij Build z menu Product. W tym momencie został skompilowany poprawnie i pozwolił mi skorzystać z opcji "według typu pliku", którą lubię lepiej.

Aha, i jeśli robi kakao rzeczy, nie zapomnij dodać następujący nagłówek w plikach:

#import <Cocoa/Cocoa.h> 

A jeśli robi rzeczy wiersza poleceń, nie zapomnij dodać następujące zamiast Nagłówek kakao:

#import <Foundation/Foundation.h> 
+0

Świetna odpowiedź! Dziękuję Ci! Myślałem, że tracę rozum ... Ulepszony mój kod xcode z 7 na 8 i nagle kod C++ nie został rozpoznany ... Dziękuję! – NpC0mpl3t3

0

Tak więc miałem problem z biblioteką Cocoapods Bypass i żadne z tych rozwiązań nic nie dało. Problem polegał na tym, że plik, który tworzy Cocoapods, nazywa się nagłówkiem parasolowym. Ta znajduje się w <POD_NAME>/Support Files/<POD_NAME>-umbrella.h. Usuń go i powinien się dobrze skompilować.

Teraz wyjaśnienie, dlaczego jest to konieczne: nagłówek parasola miesza zarówno C++, jak i kod Objective-C bezpośrednio w nagłówku, co jest dużym nie-nie pozornie i kończy się całkowicie przerwaniem importu C++. Po usunięciu (co wydaje się nie mieć żadnego wpływu?), Ten sprzeczny import, którego Cocoapod nieświadomie stworzyli, zniknie.