如何在CMAKE项目中与VCPKG正确链接库



我正在使用CMAKE项目测试VCPKG(在MacOS上)。

,由于并非所有的VCPKG软件包都有CMAKE查找模块,因此我正在尝试一个没有一个包的软件包:libuuid

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

$ 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.ainstalled/x64-osx/lib不应该通过工具链CMAKE脚本自动添加为LIB路径吗?

我会用uuid做一个目标。根据您的描述,很可能是一个称为uuid的接口库。您可以为标头和任何库的add_target_include_directoriestarget_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

最新更新