2016-02-06 19 views
8

używam ubuntu i mogę budować ICUniezdefiniowana odniesienia do `icu_56 :: UnicodeString :: UnicodeString (podpisane char, unsigned short const *, int)”

mam włączone:

#include <unistr.h> 
using namespace icu; 

to jest mój sposób budować na OIOM:

CPPFLAGS="-DU_USING_ICU_NAMESPACE=0" 
CPPFLAGS="-DU_CHARSET_IS_UTF8=1" 

export CFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_GNUC_UTF16_STRING=1 -DU_STATIC_IMPLEMENTATION" 
export CXXFLAGS="-DU_USING_ICU_NAMESPACE=0 -std=gnu++0x -DU_CHARSET_IS_UTF8=1 -DU_GNUC_UTF16_STRING=1 -DU_HAVE_CHAR16_T=1 -DUCHAR_TYPE=char16_t -Wall --std=c++0x -DU_STATIC_IMPLEMENTATION" 
export CPPFLAGS="-DU_USING_ICU_NAMESPACE=0 -DU_CHARSET_IS_UTF8=1 -DU_STATIC_IMPLEMENTATION" 
export LDFLAGS="-std=gnu++0x" 

./runConfigureICU Linux --enable-static --disable-shared --disable-renaming 

make check 
sudo make install 

następnie odwołuje się do

/usr/local/lib/libicuuc.a 

i spróbuj skompilować

icu::UnicodeString s1=UNICODE_STRING("such characters are safe 123 %-.", 32); 

ale pojawia się błąd

undefined reference to `icu_56::UnicodeString::UnicodeString(signed char, unsigned short const*, int)' 

znalazłem kolejny post tutaj na SO dotyczące tego samego problemu, ale kiedy śledzę kroki pod warunkiem, że nie rozwiązuje mojego problemu i może być inna wersja.

EDIT: Jest to wyjście z IDE na budowę projektu

Cleaning Solution: myProject (Debug) 

Cleaning: myProject (Debug) 
Removing output files... 
Clean complete 

Building Solution: myProject (Debug) 

Building: myProject (Debug) 
Performing main compilation... 

Precompiling headers 

    Compiling source to object files 
    g++ -MMD "/home/user/myProject/myProject/main.cpp" -g -O0 -std=c++11 -DDEBUG -I"/home/user/myProject/myProject/include" -I"/home/user/myProject/icu/unicode" -I"/home/user/myProject/myProject/.prec/Debug" -c -o "/home/user/myProject/myProject/bin/Debug/main.o" 

    Generating binary "myProject" from object files 
    g++ -o "/home/user/myProject/myProject/bin/Debug/myProject" "/home/user/myProject/myProject/bin/Debug/main.o" 
"/home/user/myProject/icu/libicuuc.a" 
    /home/user/myProject/myProject/bin/Debug/main.o: In function `icuTest': 
    /home/user/myProject/myProject/icuTest.hpp:3: undefined reference to `icu_56::StringPiece::StringPiece(char const*)' 
    /home/user/myProject/myProject/icuTest.hpp:3: undefined reference to `icu_56::UnicodeString::fromUTF8(icu_56::StringPiece const&)' 
    /home/user/myProject/myProject/icuTest.hpp:3: undefined reference to `icu_56::UnicodeString::~UnicodeString()' 
    /home/user/myProject/myProject/icuTest.hpp:3: undefined reference to `icu_56::UnicodeString::~UnicodeString()' 
    collect2: error: ld returned 1 exit status 
    Build complete -- 4 errors, 0 warnings 

    ---------------------- Done ---------------------- 

    Build: 4 errors, 0 warnings 
+0

Jeśli chcesz użyć .a plik można można spróbować '/ path/to/file.a' in you linker step – dlmeetei

+0

Używając 'nm', czy będziesz wyglądać, który plik .a ma' UnicodeString :: ~ UnicodeString() ' – dlmeetei

+0

Kiedy" nm libicuuc.a> dump "to robi zawierają wiele odwołań do UnicodeString, ale reszta to śmieci, więc nie wiem, czy patrzę na dekonstruktora, czy nie. – Chris

Odpowiedz

2

Zauważyłem, że linia g ++ nie jest skierowany do /usr/local/lib/libicuuc.a gdzie mówisz zainstalowany ICU . To oczywiście kompiluje się z nagłówkami OK, ale czy biblioteka statyczna istnieje w ścieżce, której używasz ("/home/user/myProject/icu/libicuuc.a")?

+0

Powinienem był zauważyć, że wziąłem go z tego samego miejsca, a ja właśnie sprawdziłem skrót pliku, który jest taki sam, tylko po to, aby udowodnić sobie. Mimo wszystko dziekuję. – Chris

1

Myślę, że problem jest w g ++ składnia:

g++ -o "/home/user/myProject/myProject/bin/Debug/myProject" "/home/user/myProject/myProject/bin/Debug/main.o" "/home/user/myProject/icu/libicuuc.a" 

Mówisz zbudować myproject użyciu main.o pliku obiektu i plik obiektowy libicuuc.a. Jednak ten drugi nie jest plikiem obiektowym, jest biblioteką statyczną. Myślę, że należy zmodyfikować g ++ linię do:

g++ /home/user/myProject/myProject/bin/Debug/main.o -L/home/user/myProject/icu/ -licuuc -o /home/user/myProject/myProject/bin/Debug/myProject 

-L/home/user/myProject/icu/ powiedzieć linker szukać bibliotek w/home/user/myProject/OIOM/folderu i -licuuc informuje go o linku bibliotekę o nazwie libicuuc.a lub libicuuc .so

+0

Zastanawiam się, czy zbudowałem ICU poprawnie, ponieważ zrobiłem dokładnie tak, jak zaleciłeś i nadal otrzymuję niezdefiniowane odniesienie do 'icu_56 :: StringPiece :: StringPiece (char const *) ' niezdefiniowane odniesienie do' icu_56 :: UnicodeString :: fromUTF8 (icu_56 :: StringPiece const &) ' niezdefiniowane odwołanie do 'icu_56 :: UnicodeString :: ~ UnicodeString()' – Chris

+0

Następnie chciałbym śledzić komentarz Jeremy'ego. Przestrzeń nazw, której używasz, to icu, ale tak naprawdę jest to icu_56 w plikach nagłówkowych i na to narzeka linker. Masz nagłówki z icu_56, ale bibliotekę z przestrzeniami nazw icu. Być może więc naprawdę odbudowałeś ICU w niewiarygodny sposób. –

+0

Próbowałem używać zarówno przestrzeni nazw icu_56, ale nie działają, ten sam błąd – Chris

2

Kiedy biegł:

./runConfigureICU Linux --enable-static --disable-shared --disable-renaming 

pan uwagę ostrzeżenie ?:

*** WARNING: You must set the following flags before code compiled against this ICU will function properly: 

    -DU_DISABLE_RENAMING=1 

The recommended way to do this is to prepend the following lines to source/common/unicode/uconfig.h or #include them near the top of that file. 

/* -DU_DISABLE_RENAMING=1 */ 
#define U_DISABLE_RENAMING 1 

Jeśli nie, zrób to teraz.

Następnie zmień swój program testowy na #include <unicode/uconfig.h> przed wszystkim innym, np.

main.cpp

#include <unicode/uconfig.h> 
#include <unicode/platform.h> 
#include <unicode/unistr.h> 

int main() 
{ 
    icu::UnicodeString s1=UNICODE_STRING("such characters are safe 123 %-.", 32); 
    (void)s1; 
    return 0; 
} 

IT będzie skompilować i łącze przeciwko libicuuc.a.

Można, jeśli chcesz zapewnić, że nagłówki szablonowe jak unicode/uconfig.h i unicode/platform.h są automatycznie uwzględniane przez kompilator przed cokolwiek innego poprzez wykorzystanie wstępnie zawierać nagłówek, np

icu_preinc.h

// pre-include header for icu 
#include <unicode/uconfig.h> 
#include <unicode/platform.h> 

które przechodzą do GCC lub brzękiem z opcją:

-include /path/to/icu_preinc.h 

można umieścić tę opcję w swojej CPPFLAGS jeśli używasz make opartych build system.

W przypadku programu zabawka powyżej to wystarczy zdefiniować U_DISABLE_RENAMING=1 na linii poleceń, bez uwzględniania <unicode/uconfig.h>

g++ -DU_DISABLE_RENAMING=1 -o prog main.cpp -L/your/libicuuc/search/path -licuuc