代码之家  ›  专栏  ›  技术社区  ›  fferri

如何在cmake项目中正确链接vcpkg中的库

  •  0
  • fferri  · 技术社区  · 5 年前

    我在测试 vcpkg (在macos上)一个cmake项目。

    因为不是所有的vcpkg包都有cmake find模块,所以我尝试使用一个没有cmake find模块的包:libuuid

    这是相对于libuuid的目录树,我可以从vcpkg根目录中看到:

    $ find packages/libuuid_x64-osx
    packages/libuuid_x64-osx
    packages/libuuid_x64-osx/include
    packages/libuuid_x64-osx/include/uuid
    packages/libuuid_x64-osx/include/uuid/uuid.h
    packages/libuuid_x64-osx/BUILD_INFO
    packages/libuuid_x64-osx/lib
    packages/libuuid_x64-osx/lib/libuuid.a
    packages/libuuid_x64-osx/CONTROL
    packages/libuuid_x64-osx/debug
    packages/libuuid_x64-osx/debug/lib
    packages/libuuid_x64-osx/debug/lib/libuuid.a
    packages/libuuid_x64-osx/share
    packages/libuuid_x64-osx/share/libuuid
    packages/libuuid_x64-osx/share/libuuid/copyright
    

    示例程序:

    #include <iostream>
    #include <uuid/uuid.h>
    
    int main(int argc, char **argv)
    {
        std::cout << "Hello, world!" << std::endl;
    
        return 0;
    }
    

    示例cmakelists.txt

    cmake_minimum_required(VERSION 3.13)
    
    project(vcpkg_example_project)
    
    add_executable(app app.cpp)
    target_link_libraries(app uuid)
    

    如果我理解正确,VCPKG的理念是 提供缺少的cmake find模块,但是 #include <libfoo/foo.h> 开箱即用。事实上,上面的例子编译得很好。但找不到 -luuid :

    $ cmake -DCMAKE_TOOCHAIN_FILE=/Users/me/Dev/vcpkg/scripts/buildsystems/vcpkg.cmake ..
    ...
    $ cmake --build .
    Scanning dependencies of target app
    [ 50%] Building CXX object CMakeFiles/app.dir/app.cpp.o
    [100%] Linking CXX executable app
    ld: library not found for -luuid
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make[2]: *** [app] Error 1
    make[1]: *** [CMakeFiles/app.dir/all] Error 2
    make: *** [all] Error 2
    

    我错过了什么?

    而且,我看到有一个 installed/x64-osx/lib/libuuid.a . 不应该 installed/x64-osx/lib 由工具链cmake脚本自动添加为库路径?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Cascades    5 年前

    我会用Uuid做目标。根据你的描述,很可能是 Interface Library 打电话 uuid . 你可以 add_target_include_directories target_link_libraries 对于头和任何库,然后将其添加到项目的其余部分。

    所以像这样:

    add_library(uuid INTERFACE)
    
    if(${CMAKE_BUILD_TYPE} strequal "Release")
        find_library(LIBUUID uuid "${CMAKE_CURRENT_SOURCE_DIR}/packages/libuuid_x64-osx/lib/")
    else()
        find_library(LIBUUID uuid "${CMAKE_CURRENT_SOURCE_DIR}/packages/libuuid_x64-osx/debug/lib/")
    endif()
    
    target_link_libraries(uuid INTERFACE "${LIBUUID}")
    
    target_include_directories(uuid SYSTEM INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/packages/libuuid_x64-osx/include")
    

    我会做一个 add_subdirectory 指向库的文件夹并链接到 UUID