2016-02-06 29 views
8

Sono in esecuzione ubuntu, e posso costruire ICUundefined reference to `icu_56 :: :: UnicodeString UnicodeString (char firmato, unsigned short const *, int)'

ho incluso:

#include <unistr.h> 
using namespace icu; 

Questo è il mio metodo di generazione per ICU:

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 

ho quindi collegare

/usr/local/lib/libicuuc.a 

e provare a compilare

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

ma l'errore

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

ho trovato un altro post qui su SO per quanto riguarda lo stesso problema, ma quando seguo la procedura descritta non risolve il problema e potrebbe essere una versione diversa.

EDIT: Questa è l'uscita dalla IDE sulla costruzione del progetto

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

Se si desidera utilizzare il file .a, può essere che si può provare a '/ percorso/to/file.a' nel tuo linker step – dlmeetei

+0

Usando 'nm', avrai un aspetto, il quale .a file ha il' UnicodeString :: ~ UnicodeString() ' – dlmeetei

+0

Quando I" nm libicuuc.a> dump "lo fa contiene molti riferimenti a UnicodeString ma il resto è spazzatura quindi non so se sto guardando il decostruttore o no – Chris

risposta

2

ho notato che il vostro g ++ linea non punta a /usr/local/lib/libicuuc.a dove dici è stato installato ICU . Ovviamente si sta compilando contro le intestazioni OK, ma la libreria statica esiste nel percorso che si sta utilizzando ("/home/user/myProject/icu/libicuuc.a")?

+0

Avrei dovuto precisare che l'ho preso dallo stesso posto, e ho appena controllato l'hash del file che è lo stesso, solo per provare a me stesso. Grazie lo stesso. – Chris

1

Credo che il problema è nella g ++ sintassi:

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

Lei sta dicendo di costruire myProject utilizzando file oggetto main.o e libicuuc.a file oggetto. Tuttavia, quest'ultimo non è un file oggetto, è una libreria statica. Penso che si dovrebbe modificare la riga g ++ per:

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/ dire al linker a cercare librerie in/home/utente/ICU/cartella myProject/e -licuuc dice che o collegamento una libreria denominata libicuuc.a o libicuuc .so

+0

Mi chiedo se ho creato ICU correttamente perché ho fatto esattamente come consigliato e ottengo ancora un riferimento indefinito a 'icu_56 :: StringPiece :: StringPiece (char const *) ' riferimento indefinito a' icu_56 :: UnicodeString :: fromUTF8 (icu_56 :: StringPiece const &) ' riferimento non definito a' icu_56 :: UnicodeString :: ~ UnicodeString() ' – Chris

+0

Quindi vorrei dare seguito al commento di Jeremy. Lo spazio dei nomi che stai sostenendo di utilizzare è icu, ma in realtà è icu_56 nei file di intestazione e questo è ciò di cui si lamenta il linker. Hai intestazioni con icu_56, ma libreria con namespace icu. Quindi, forse, hai davvero ricostruito la terapia intensiva in modo incorretto. –

+0

Ho provato ad usare sia lo spazio dei nomi icu che icu_56 ma non funziona, lo stesso errore – Chris

2

Quando è stato eseguito:

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

ti è seguire l'avvertimento ?:

*** 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 

In caso contrario, fallo ora.

Successivamente, modificare il programma di test su #include <unicode/uconfig.h> prima di tutto, ad es.

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; 
} 

La si compilare e collegare contro libicuuc.a.

è possibile se si desidera garantire che le intestazioni boilerplate come unicode/uconfig.h e unicode/platform.h vengono inclusi automaticamente dal compilatore prima di ogni altra cosa facendo uso di un pre-includere intestazione, per esempio

icu_preinc.h

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

che si passa a GCC o clang con l'opzione:

-include /path/to/icu_preinc.h 

Si può mettere questa opzione nel CPPFLAGS se si utilizza una configurazione basata su make sistema.

Nel caso del programma giocattolo sopra di esso è appena sufficiente per definire U_DISABLE_RENAMING=1 sulla riga di comando, senza includere <unicode/uconfig.h>

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