表达式不是整数常量clang libc++线程化

7

我正尝试在我的Linux机器(Ubuntu)上编译一个非常简单的线程程序,但是即使我指定了libc++,clang似乎仍然向我抛出错误。我的程序如下:

#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 $@

.cpp.o:
        $(CC) $(CFLAGS) $< -o $@

具体错误:

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

我不确定为什么clang没有使用libc++,因为如果我没记错的话,clang会使用这个库编译线程。感激任何帮助!


也许您可以向我们展示clang提供的错误信息。 - hetepeperfan
你把 LDFLAGS 拼错了。 - kennytm
2
请注意,这是一个已知问题。LLVM报告Ubuntu报告Debian报告Clang邮件列表 - Albert
1个回答

8
在一些(早期的)libc++版本中,一些函数没有被标记为constexpr,这意味着它们不能在static_assert中使用。您应该检查system_clock::duration::min()是否实际上被标记为这样。[您可能需要检查numeric_limits,因为我似乎记得问题就出在那里]
好消息是,如果这是问题所在,那么您可以自己将constexpr添加到numeric limits头文件中;它不会引起任何其他问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接