Clion编译Libuv

起因

Vs2019在编译的Libuv时候,莫名其妙的一直在报错,原先是没问题的.怀疑是不是更新VS出的问题的.Clion更多的还是学习Rust的时候才使用的.没有通过Clion编译过开源项目.这里采用比较笨的方式. 具体可以查看这篇: libuv编译
  1. 新建一个c语言的项目
  2. 将libuv的源码放入当前项目中
  3. 从libuv的CMakeLists.txt拷入部分

1. 源码组织

libuv在Clion的组织架构
这里将源码放入到项目中,主要是为了学习和调试方便的.

2. Cmake的配置

从libuv的CmakeLists.txt 拷入需要的配置信息:
cmake_minimum_required(VERSION 3.15)
project(mylibuv C)

set(CMAKE_C_STANDARD 99)

#指定libuv的所在目录
set(UV 3rd/uv)

#指定libuv所需的头文件目录
include_directories(${UV}/include ${UV}/src)


#libuv 通用源文件或者说支持平台的源文件
set(uv_sources
        ${UV}/src/fs-poll.c
        ${UV}/src/idna.c
        ${UV}/src/inet.c
        ${UV}/src/random.c
        ${UV}/src/strscpy.c
        ${UV}/src/threadpool.c
        ${UV}/src/timer.c
        ${UV}/src/uv-common.c
        ${UV}/src/uv-data-getter-setters.c
        ${UV}/src/version.c)

#libuv 在windows的源文件
if(WIN32)
    list(APPEND uv_defines WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0600)
    #libuv编译时,需要链接的静态库
    list(APPEND uv_libraries
            psapi
            iphlpapi
            userenv
            ws2_32)
    list(APPEND uv_sources
            ${UV}/src/win/async.c
            ${UV}/src/win/core.c
            ${UV}/src/win/detect-wakeup.c
            ${UV}/src/win/dl.c
            ${UV}/src/win/error.c
            ${UV}/src/win/fs.c
            ${UV}/src/win/fs-event.c
            ${UV}/src/win/getaddrinfo.c
            ${UV}/src/win/getnameinfo.c
            ${UV}/src/win/handle.c
            ${UV}/src/win/loop-watcher.c
            ${UV}/src/win/pipe.c
            ${UV}/src/win/thread.c
            ${UV}/src/win/poll.c
            ${UV}/src/win/process.c
            ${UV}/src/win/process-stdio.c
            ${UV}/src/win/signal.c
            ${UV}/src/win/snprintf.c
            ${UV}/src/win/stream.c
            ${UV}/src/win/tcp.c
            ${UV}/src/win/tty.c
            ${UV}/src/win/udp.c
            ${UV}/src/win/util.c
            ${UV}/src/win/winapi.c
            ${UV}/src/win/winsock.c)
    list(APPEND uv_test_libraries ws2_32)
    list(APPEND uv_test_sources ${UV}/src/win/snprintf.c test/runner-win.c)
endif()

add_library(uv SHARED ${uv_sources})
target_compile_definitions(uv
        INTERFACE
        USING_UV_SHARED=1
        PRIVATE
        BUILDING_UV_SHARED=1
        ${uv_defines})
target_compile_options(uv PRIVATE ${uv_cflags})
target_include_directories(uv
        PUBLIC
        {content}lt;BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
        {content}lt;INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
        PRIVATE
        {content}lt;BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)

link_libraries(psapi
        iphlpapi
        userenv
        ws2_32)

target_link_libraries(uv ${uv_libraries})

add_executable(mylibuv main.c ${uv_sources})

3. 运行demo

int main(int argc,char* argv[])
{
    printf("hello world!\n");

    uv_loop_t* loop = uv_default_loop();

    printf("Now quitting.\n");
    uv_run(loop,UV_RUN_DEFAULT);

    uv_loop_close(loop);

    free(loop);
    return 0;
}

Clion运行libuv的demo

后来发现并不是VS2019的问题,有可能是调试源码的时候,改动头文件,造成编译不通过的

秋风 2020-08-23