gpt4 book ai didi

c++ - 如何在 CMake 项目中包含 IntelliSense 的外部库源?

转载 作者:行者123 更新时间:2023-11-30 03:13:49 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 的 CMake 项目模板在 Visual Studio 中开发 C++ 应用程序。要构建我的应用程序,我只需要 header 和外部库,我可以像这样链接它:

# CMakeList.txt : CMake project for myapp, include source and define project specific logic here.

cmake_minimum_required (VERSION 3.8)

# Add source to this project's executable.
add_executable (myapp "myapp.cpp" "myapp.h")

# Add TIFF library
set(TIFF_INCLUDE_DIR "C:\\libs\\tiff\\out\\install\\x64-Debug\\include")
set(TIFF_LIBRARY "C:\\libs\\tiff\\out\\install\\x64-Debug\\lib\\tiffd.lib")
find_package(TIFF REQUIRED)
target_link_libraries(myapp PRIVATE TIFF::TIFF)

到目前为止,还不错。我可以使用 tiff 库打开、读取、写入 tiff 文件等,而且 IntelliSense 正在 catch 头文件中的声明。但是,我希望 IntelliSense 也知道 TIFF 库的完整源代码。例如,如果我在 myapp.cpp 中并且我在 TIFFOpenctrl+click 它会打开对应于 TIFFOpen 的 header ,但是当我 ctrl+click TIFFOpen 在头文件中,它不会转到相应的源文件,这是 myapp 源文件的正常行为.这是可以理解的,因为我从未告诉 Visual Studio 在哪里可以找到外部库的源文件。

CMake 不需要知道外部库的源文件在哪里,因为它不会构建外部库,因此我想我不会/不应该更改 CMakeLists.txt 中的任何内容

一个选项(我还没有尝试过,但我很确定它会起作用)是将整个 tiff 库作为 myapp 的子项目包含在内。不过,这个解决方案确实存在一些问题:

  1. 外部库在概念上不是项目的组成部分,我不打算修改外部库。这更像是一个原则问题。
  2. 只是将它作为我项目中的子文件夹会使我冒着更改我不打算更改的内容的风险。
  3. 我不想在进行全部重建时重建外部库。我知道 Visual Studio/CMake 足够聪明,可以判断出什么都没有改变,也不会重建,但我宁愿让 Visual Studio/CMake 都不要尝试。

在我看来,我必须在 Visual Studio 设置中的某处设置包含源文件的目录,但仍与项目相关。我最好的猜测是 .vs/ProjectSettings.json 是我需要以某种方式编辑的文件,但老实说,我不知道。

或者,也许我可以在 CMakeLists.txt 中编写一些命令,该命令不执行任何操作,但会触发 IntelliSense 在包含源文件的文件夹中查找。同样,我不知道该怎么做。

简而言之,我希望 IntelliSense 查看外部库的所有源文件,就像它查看 myapp 的源文件一样,而不包括外部库的所有源文件作为 myapp 的子项目。如果可能的话,我应该怎么做?

如果相关,我使用 Visual Studio 2019 Community 及其附带的 CMake (3.15)。

最佳答案

关于你最后的评论,在评论区写代码很不方便,所以我就把它贴在这里,虽然不是答案。

libtiff-4.pc适用于 pkg-config,而非 cmake,并且 find_package()不能直接在 Windows 上处理它,如果你真的想的话,需要做一些工作。手动编写所有内容可能更容易。记得设置 tiff.libtiffd.lib根据您的配置。您可以使用 CMAKE_BUILD_TYPE变量和 if()命令如:

# set build type to release if not specified
if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
endif()
# switch lib to link according to build type
if(CMAKE_BUILD_TYPE STREQUAL "Release")
# for release
set(TIFF_LIBRARY "<your_path_to_installed_lib>/tiff.lib")
else()
# for debug. If you have other configs like relwithdebinfo you can add more
set(TIFF_LIBRARY "<your_path_to_installed_lib>/tiffd.lib")
endif()

此外,删除 find_package()并使用 target_link_libraries()target_inlude_directories() :

set(TIFF_INCLUDE_DIR "<your_path_to_installed_headers>/include")
target_link_libraries(myapp PRIVATE ${TIFF_LIBRARY})
target_include_directories(myapp PRIVATE ${TIFF_INCLUDE_DIR})

您也可以跳过设置 TIFF_LIBRARYTIFF_INCLUDE_DIR并根据需要直接传递字符串。

我经常使用 Visual Studio,它是我最喜欢的 IDE。但是在 Windows 上用 cmake 进行包管理不如 Linux 顺畅。永远记得在编译和安装外部库后设置环境变量。

通常 find_package() 会查找名为 <libname>_DIR 的系统环境变量(例如 TIFF_DIR ,在您的情况下找不到),用于存储已安装库的路径,然后查找 <libname>Config.cmake<libname>ConfigVersion.cmake在该文件夹中(对于 TIFF 会失败,因为它没有它们)。

它也搜索其他地方,查看https://cmake.org/cmake/help/v3.15/command/find_package.html?highlight=find_package了解详情。

因此,对于那些具有 cmake 导出文件的库,添加一个具有正确名称和值的变量。这仅用于编译。

如果你想让你的应用程序在编译后运行,你还需要将安装的lib的二进制文件(通常是*.dll)的路径添加到系统的Path中。多变的。在您的情况下,您应该找到类似 tiff.dll 的内容和 tiffd.dll编译安装后,将该文件夹添加到Path一切顺利。

关于c++ - 如何在 CMake 项目中包含 IntelliSense 的外部库源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com