在QtCreator上使用abseil-cpp

最近看了下github上的Trending,看到个abseil-cpp库,准备下载下来学习一下,具体就不过多介绍了,官网上有详细的说明。

它一部分功能可以直接包含头文件使用,但是其中有一部分需要包含源文件,如果每个项目都需要包含大量的源文件,这其中的依赖问题就需要很长时间,它使用bazel来解决源码之间的依赖问题,我不太了解bazel,也懒的去装这玩意,我主要想把它灵活的运用在QtCreator上。

其实qmake也可以解决依赖问题,但是可能比较麻烦,我尝试根据它项目中的bazel文件写了一些配置,可以大体上方便的使用:

abseil.pri

把上面代码保存到abseil-cpp项目目录中,然后再自己的项目中使用:

absl += base spinlock_wait throw_delegate internal strings

include(e:/3rdParty/abseil-cpp/absl.pri)

测试代码:

#include <iostream>
#include <thread>
#include <chrono>
#include "absl/synchronization/internal/thread_pool.h"
#include "absl/base/call_once.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"

int main()
{
    const char * hello = "Hello World";

    absl::synchronization_internal::ThreadPool pool(5);

    auto start = absl::Now();

    absl::string_view view(hello);

    std::cout << view << std::endl;
    std::cout << view.length() << std::endl;

    absl::once_flag flag1;

    auto func = [&](){
        std::this_thread::sleep_for(std::chrono::seconds(5));
        std::cout << view << std::endl;
        absl::call_once(flag1, [](){
            std::cout << "Hello World call_once" << std::endl;
        });
    };

    for (int i = 0; i < 5; i++) {
        pool.Schedule(func);
    }

    auto elapsed = absl::Now() - start;
    std::cout << elapsed << std::endl;
    std::cout << absl::ToInt64Milliseconds(elapsed) << "ms" << std::endl;

    return 0;
}

总结一下,其实qmake可以实现的更完美,不过个人使用来说没有必要了。

补充:
abseil-cpp里的time以及ThreadPool相关库是需要cctz库的,但是cctz貌似在Windows下msvc2015没法编译过去,这就尴尬了。

20180808补充:
abseil-cpp已经支持cmake了,直接用cmake编译成静态库就可以使用了。

参考链接:
http://doc.qt.io/qt-5/qmake-test-function-reference.html

没有评论: