2013-05-16 15 views
5

Sto provando a compilare un programma thread molto semplice sulla mia macchina Linux (ubuntu), ma clang sembra ancora lanciare un errore su di me anche quando si specifica libC++. il mio programma è:espressione non è una costante intergrale clang libC++ threading

#include <iostream> 
#include <thread> 

void call_from_thread() { 
    std::cout << "Hello, World!" << std::endl; 
} 

int main() 
{ 
    std::thread t1(call_from_thread); 

    t1.join(); 
    return 0; 
} 

makefile:

CC=clang++ 
CFLAGS=-std=c++11 -stdlib=libc++ -pthread -c -Wall 
#proper declaration of libc++, but still an error... 
LDFALGS= 
SOURCES=main.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=bimap 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
     $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
     $(CC) $(CFLAGS) $< -o [email protected] 

errore specifico:

In file included from main.cpp:2: 
In file included from /usr/include/c++/4.6/thread:37: 
/usr/include/c++/4.6/chrono:666:7: error: static_assert expression is not an 
     integral constant expression 
     static_assert(system_clock::duration::min() 
    ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
1 error generated. 
make: *** [main.o] Error 1 

io non sono sicuro perché clang non utilizza libC++, perché se non sbaglio, clang compilerà i thread usando questa libreria. Qualsiasi aiuto è apprezzato!

+0

Forse mostraci il messaggio di errore fornito. – hetepeperfan

+0

Hai digitato 'LDFLAGS 'erroneamente. – kennytm

+2

Si noti che questo è un problema noto. [Rapporto LLVM] (http://llvm.org/bugs/show_bug.cgi?id=12893), [Rapporto di Ubuntu] (https://bugs.launchpad.net/ubuntu/+source/clang/+bug/1081905), [Rapporto Debian] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666539), [Clang mailinglist] (http://lists.cs.uiuc.edu/pipermail/cfe -dev/2011-giugno/015641.html) – Albert

risposta

3

In alcune (precedenti) versioni di libC++, alcune funzioni non erano contrassegnate come constexpr, il che significa che non possono essere utilizzate in static_assert. Dovresti controllare che system_clock::duration::min() sia effettivamente contrassegnato in questo modo. [Probabilmente dovresti controllare numeric_limits, poiché mi sembra di ricordare che era il problema]

La buona notizia è che, se questo è il problema, è possibile aggiungere constexpr al file di intestazione dei limiti numerici te stesso; non causerà altri problemi.

Problemi correlati