我的任务是开始用CMake设计C ++跨平台程序。我们的主要依赖项之一涉及内部nuget程序包。对于我们的Windows C ++项目,我只需右键单击该项目,然后选择管理Nuget程序包。在跨平台中,没有这样的选择,我正在努力寻找有关如何处理这些依赖项的任何相关信息。任何人都可以将我链接到任何好的信息来源或演示吗?
答案 0 :(得分:1)
编辑:从CMake 3.15开始,CMake支持使用VS_PACKAGE_REFERENCES
引用Nuget软件包。现在,这是一个比以下建议的解决方法更 更清洁的解决方案。要将Nuget软件包引用添加到CMake目标,请使用软件包名称和软件包版本,并用下划线_
分隔;这是BouncyCastle
版本1.8.5的示例:
set_property(TARGET MyApplication
PROPERTY VS_PACKAGE_REFERENCES "BouncyCastle_1.8.5"
)
在CMake 3.15之前,CMake没有用于Nuget支持的内置命令,因此您将必须使用nuget
command line utilities来使用CMake包括Nuget依赖项。
您可以使用CMake的find_program()
来定位nuget
命令行实用程序(已安装),再结合add_custom_command()
或execute_process()
来执行nuget
命令CMake。此question的答案进行了更详细的讨论,但从本质上来说,它可能看起来像这样:
# Find Nuget (install the latest CLI here: https://www.nuget.org/downloads).
find_program(NUGET nuget)
if(NOT NUGET)
message(FATAL "CMake could not find the nuget command line tool. Please install it!")
else()
# Copy the Nuget config file from source location to the CMake build directory.
configure_file(packages.config.in packages.config COPYONLY)
# Run Nuget using the .config file to install any missing dependencies to the build directory.
execute_process(COMMAND
${NUGET} restore packages.config -SolutionDirectory ${CMAKE_BINARY_DIR}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
endif()
这假设您已有一个packages.config
文件,其中列出了项目的nuget依赖项。
要将依赖关系绑定到特定目标,(不幸的)您必须使用nuget
放置程序集/库的完整路径。
对于.NET nuget软件包,它看起来像这样:
# Provide the path to the Nuget-installed references.
set_property(TARGET MyTarget PROPERTY
VS_DOTNET_REFERENCE_MyReferenceLib
${CMAKE_BINARY_DIR}/packages/path/to/nuget/lib/MyReferenceLib.dll
)
对于C ++风格的nuget包,它可能看起来像这样:
add_library(MyLibrary PUBLIC
MySource.cpp
MyClass1.cpp
...
)
# Provide the path to the Nuget-installed libraries.
target_link_libraries(MyLibrary PUBLIC
${CMAKE_BINARY_DIR}/packages/path/to/nuget/lib/MyCppLib.dll
)
顺便说一句,CMake 确实支持带有CPack的Nuget软件包的 creation 。这是CPack Nuget生成器的documentation。