2017-10-16 15 views
1

Je viens d'écrire un code de test pour coroutine en C++ 2a.comment lien statique avec clang libC++

Je construis le code avec clang 5.0 avec:

clang++ testcoroutine.cpp -std=c++2a -I../asio_alone -fcoroutines-ts -stdlib=libc++ 

Le code fonctionne très bien.

Maintenant, je veux lier statique de la libC++. Afin que je puisse exécuter le a.out dans un autre PC, je googled, mais seulement trouver le -static-libstdc++.

Je ne peux pas utiliser le -static-libstdc++ car le libstdc++ ne prend pas en charge le coroutine.

Si j'utilise le -static-libstdC++:

clang++ testcoroutine.cpp -std=c++2a -I../asio_alone -fcoroutines-ts 
-static-libstdc++ 
testcoroutine.cpp:26:10: fatal error: 'experimental/coroutine' file not found 
#include <experimental/coroutine> 


^~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. 

Toute suggestion?


Le code de test:

#define ASIO_STANDALONE 
#define ASIO_HAS_STD_CHRONO 

#ifdef _WIN32 
#pragma warning (disable:4819) 
#pragma warning (disable:4503) 
#pragma warning (disable:4996) 
#pragma warning (disable:4100) // unref parameters 
#define _CRT_SECURE_NO_WARNINGS 
#define NOMINMAX 
#define _CRT_NONSTDC_NO_DEPRECATE 
#define WIN32_LEAN_AND_MEAN 
#endif 

#ifdef _WIN32 
#include <SDKDDKVer.h> 
#endif 

#include <stdio.h> 
#include <cstdio> 
#include <thread> 
#include <algorithm> 
#include <future> 
#include <chrono> 
#include <experimental/coroutine> 
#include <asio.hpp> 

// clang++ testcoroutine.cpp -std=c++2a -I../asio_alone -fcoroutines-ts -stdlib=libc++ 

#ifndef _WIN32 
template <typename... Args> 
struct std::experimental::coroutine_traits<std::future<void>, Args...> { 
    struct promise_type { 
     std::promise<void> p; 
     auto get_return_object() { return p.get_future(); } 
     std::experimental::suspend_never initial_suspend() { return {}; } 
     std::experimental::suspend_never final_suspend() { return {}; } 
     void set_exception(std::exception_ptr e) { p.set_exception(std::move(e)); } 
     void return_void() { p.set_value(); } 
     void unhandled_exception() { std::terminate(); } 
    }; 
}; 
#endif 

template <typename R, typename P> 
auto async_await(asio::steady_timer &t, std::chrono::duration<R, P> d) { 
    struct Awaiter { 
     asio::steady_timer &t; 
     std::chrono::duration<R, P> d; 
     asio::error_code ec; 

     bool await_ready() { return d.count() == 0; } 
     void await_resume() { 
      if (ec) 
       throw ec; 
     } 
     void await_suspend(std::experimental::coroutine_handle<> coro) { 
      t.expires_from_now(d); 
      t.async_wait([this, coro](auto ec) mutable { 
       this->ec = ec; 
       coro.resume(); 
      }); 
     } 
    }; 
    return Awaiter{ t, d }; 
} 


std::future<void> sleepy(asio::io_service &io) { 
    asio::steady_timer timer(io); 
    co_await async_await(timer, std::chrono::milliseconds(100)); 
    puts("tick1"); 
    co_await async_await(timer, std::chrono::milliseconds(100)); 
    puts("tick2"); 
    co_await async_await(timer, std::chrono::milliseconds(100)); 
    puts("tick3"); 
} 

int main() 
{  
    asio::io_service io; 
    sleepy(io); 
    io.run(); 
    return 0; 
} 

Répondre

0

GNU libstdC++ ++ et libc LLVM sont deux implémentations différentes de la bibliothèque standard C++.

Apparemment, votre libstdC++ ne supporte pas encore les Coroutines TS, vous devez donc vous en tenir à libC++.

Pour lier votre application statiquement il suffit d'utiliser -static:

clang++ testcoroutine.cpp -std=c++2a -I../asio_alone -fcoroutines-ts -stdlib=libc++ -static 
+0

J'ai essayé "-static", mais nous avons eu des tonnes d'erreur de lien. – alpha

+0

Ajoutez cette information à la question, y compris le message d'erreur. – rustyx