0

我试图了解 CMake,并一直在 Windows 10 上的 Visual Studio Code 中使用一个简单的项目对其进行测试,该项目有几个头文件,并且在手动完成时编译没有问题。我已经cmake ..从该build文件夹成功运行,但是在运行时,cmake --build .我收到了上述关于我的weight_converter.vcxproj文件的错误。

我已经在网上进行了大量搜索,但找不到任何可以回答正在发生的事情的东西。

从其他结果中,我在 Visual Studio 中看到了一些建议,可以添加<file>.lib到 Visual Studio 上的项目选项 -> 链接器 -> 输入 -> 附加依赖项,但我使用的是 Visual Studio 代码并且找不到相应的设置。我.vcxproj在我的项目中找到了该文件,虽然我真的不知道其中发生了什么,但它写在标题src.lib旁边。<Link>/<AdditionalDependencies>

这是我的主要CMakeLists.txt文件内容供参考:

#   set minimum CMake version, project name, and C++ standard
cmake_minimum_required(VERSION 3.19.4)
project("weight_converter")

add_subdirectory(src)

add_executable(weight_converter weight_converter.cpp )

target_include_directories("${PROJECT_NAME}" PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/src")

file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)    
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin ) 

file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)

target_link_libraries("${PROJECT_NAME}" PUBLIC src)

这是我src文件夹中的 CMakeLists.txt 文件:

add_library(imperial_to_metric imperial_to_metric.cpp)
add_library(metric_to_imperial metric_to_imperial.cpp)

如果重要的话,这是我的项目结构:

├───.vscode
├───bin
│   └───Debug
├───build
│   ├───.cmake
│   │   └───api
│   │       └───v1
│   │           ├───query
│   │           │   └───client-vscode
│   │           └───reply
│   ├───CMakeFiles
│   │   ├───3.19.4
│   │   │   ├───CompilerIdC
│   │   │   │   ├───Debug
│   │   │   │   │   └───CompilerIdC.tlog
│   │   │   │   └───tmp
│   │   │   ├───CompilerIdCXX
│   │   │   │   ├───Debug
│   │   │   │   │   └───CompilerIdCXX.tlog
│   │   │   │   └───tmp
│   │   │   └───x64
│   │   │       └───Debug
│   │   │           └───VCTargetsPath.tlog
│   │   ├───CMakeTmp
│   │   └───fa0880fffde885133f10c0b2cfeb0cbc
│   ├───Debug
│   ├───src
│   │   ├───CMakeFiles
│   │   ├───Debug
│   │   ├───imperial_to_metric.dir
│   │   │   └───Debug
│   │   │       └───imperial.31E5CD06.tlog
│   │   └───metric_to_imperial.dir
│   │       └───Debug
│   │           └───metric_t.0BAA5631.tlog
│   ├───weight_converter.dir
│   │   └───Debug
│   │       └───weight_converter.tlog
│   └───x64
│       └───Debug
│           └───ZERO_CHECK
│               └───ZERO_CHECK.tlog
├───lib
├───src
│   └───CMakeLists.txt
│   └───imperial_to_metric.cpp
│   └───metric_to_imperial.cpp
│   └───imperial_to_metric.h
│   └───metric_to_imperial.h
│
├───CMakeLists.txt
└───weight_converter.cpp
4

1 回答 1

2

根本问题是这样的:

target_link_libraries("${PROJECT_NAME}" PUBLIC src)

这告诉 CMake 链接到一个名为src. 但是在src/CMakeLists.txt库中被调用。imperial_to_metricmetric_to_imperial

add_library(imperial_to_metric imperial_to_metric.cpp)
add_library(metric_to_imperial metric_to_imperial.cpp)

所以一个人可能想要的是

target_link_libraries("${PROJECT_NAME}" PUBLIC imperial_to_metric metric_to_imperial)

一个小问题,但让库目标指定构建要求通常是更好的做法。所以而不是:

target_include_directories("${PROJECT_NAME}" PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/src")

一个会有以下内容src/CMakeLists.txt

target_include_directories(metric_to_imperial PUBLIC ".")
target_include_directories(imperial_to_metric PUBLIC ".")

这样,任何消费者只需通过命令imperial_to_metric即可获得所需的包含目录。target_link_libraries

于 2021-01-30T19:26:25.567 回答