2013-05-16 8 views
5

Próbuję skompilować naprawdę prosty program wątku na mojej maszynie linuxowej (ubuntu), ale wydaje mi się, że clang wciąż rzuca na mnie błąd, nawet gdy określam libC++. mój program jest:Wyrażenie nie jest stałą międzyklamową 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] 

specyficzny błąd:

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 

Nie jestem pewien, dlaczego nie wykorzystuje dzyń libC++, ponieważ jeśli się nie mylę, clang skompiluje wątki za pomocą tej biblioteki. Każda pomoc jest doceniana!

+0

Być może pokaż nam, jaki błąd zapewnia klang. – hetepeperfan

+0

Podałeś błędnie "LDFLAGS". – kennytm

+2

Należy zauważyć, że jest to znany problem. [Raport LLVM] (http://llvm.org/bugs/show_bug.cgi?id=12893), [raport Ubuntu] (https://bugs.launchpad.net/ubuntu/+source/clang/+bug/1081905), [Raport Debiana] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666539), [Clang mailinglist] (http://lists.cs.uiuc.edu/pipermail/cfe -dev/2011-June/015641.html) – Albert

Odpowiedz

3

W niektórych (wcześniejszych) wersjach biblioteki libC++ niektóre funkcje nie zostały oznaczone jako constexpr, co oznacza, że ​​nie można ich używać w static_assert. Powinieneś sprawdzić, czy system_clock::duration::min() jest faktycznie oznaczony w ten sposób. [Będziesz prawdopodobnie musiał sprawdzić numeric_limits, ponieważ wydaje mi się, że to był problem]

Dobrą wiadomością jest to, że jeśli to jest problem, możesz dodać constexpr do pliku nagłówkowego limitów liczbowych siebie; nie spowoduje żadnych innych problemów.