【问题标题】:C++: How to properly link compiled object using CMake in VSCodeC++:如何在 VSCode 中使用 CMake 正确链接编译对象
【发布时间】:2020-12-14 19:45:47
【问题描述】:

操作系统
视窗 10
CMake:3.16.3
编辑器
VSCode:1.48.1
扩展
CMake 工具:1.4.1
C/C++ 0.30.0-insiders3
工具包
Visual Studio 社区 2019 版 - amd64
项目回购
https://gitlab.com/NumeralRocket/kepler 已删除,不足以满足最小可重复示例
教程
Google Test 和 CMake 简介
https://www.youtube.com/watch?v=Lp1ifh9TuFI

我正在尝试使用 CMake 为我的一个个人项目构建单元测试,虽然我完全承认我是 CMake 的新手和 C++ 的新手,但我对如何解决这个问题感到困惑。当我去构建我的项目时,我收到以下链接器错误:

[main] Building folder: kepler 
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build n:/Unreal_Engine/Magellan/kepler/build-vscode --config Debug --target ALL_BUILD -- /maxcpucount:14
[build] Microsoft (R) Build Engine version 16.6.0+5ff7b0c9e for .NET Framework
[build] Copyright (C) Microsoft Corporation. All rights reserved.
[build] 
[build]   gmock.vcxproj -> N:\Unreal_Engine\Magellan\kepler\build-vscode\lib\Debug\gmockd.lib
[build]   gmock_main.vcxproj -> N:\Unreal_Engine\Magellan\kepler\build-vscode\lib\Debug\gmock_maind.lib
[build]   kepler.vcxproj -> N:\Unreal_Engine\Magellan\kepler\build-vscode\Debug\kepler.lib
[build]   gtest.vcxproj -> N:\Unreal_Engine\Magellan\kepler\build-vscode\lib\Debug\gtestd.lib
[build]   gtest_main.vcxproj -> N:\Unreal_Engine\Magellan\kepler\build-vscode\lib\Debug\gtest_maind.lib
[build] LINK : fatal error LNK1104: cannot open file 'Quaternion.lib' [N:\Unreal_Engine\Magellan\kepler\build-vscode\test\QuaternionTests.vcxproj]
[cmakefileapi-parser] Code model version (2.1) of cmake-file-api is unexpected. Expecting (2.0). IntelliSense configuration may be incorrect.
[cmakefileapi-parser] Code model version (2.1) of cmake-file-api is unexpected. Expecting (2.0). IntelliSense configuration may be incorrect.
[build] Build finished with exit code 1

就上下文而言,项目结构如下:

${ProjectRoot}
├── CMakeLists.txt
├── Quaternion.cpp
├── Quaternion.hpp
├── googletest
└── test
    ├── CMakeLists.txt
    └── QuaternionTest.cpp

${ProjectRoot}/CMakeLists.txt

cmake_minimum_required(VERSION 3.16) # version can be different
set(CMAKE_VERBOSE_MAKEFILE ON)

set(This kepler)
get_filename_component(CODE_ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)

project(${This}) #name of your project

project(${This} C CXX)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

enable_testing()

add_subdirectory(googletest)
add_subdirectory(test)

set(Headers
    Quaternion.hpp
)

set(Sources
    Quaternion.cpp
)

add_library(${This} STATIC ${Sources} ${Headers})

${ProjectRoot}/Quaternion.cpp

#include <iostream>
#include "Quaternion.hpp"


// Default Constructor
Quaternion::Quaternion() {}

// Specified Value Constructor
Quaternion::Quaternion(double qs, double qi, double qj, double qk) : q0(qs), q1(qi), q2(qj), q3(qk) {}

Quaternion operator + (Quaternion const &quatA, Quaternion const &quatB) // 1) § 5.3
{
    Quaternion quatC;
    quatC.q0 = quatA.q0 + quatB.q0;
    quatC.q1 = quatA.q1 + quatB.q1;
    quatC.q2 = quatA.q2 + quatB.q2;
    quatC.q3 = quatA.q3 + quatB.q3;
    return quatC;
}

Quaternion operator - (Quaternion const &quatA, Quaternion const &quatB) // 1) § 5.3
{
    Quaternion quatC;
    quatC.q0 = quatA.q0 - quatB.q0;
    quatC.q1 = quatA.q1 - quatB.q1;
    quatC.q2 = quatA.q2 - quatB.q2;
    quatC.q3 = quatA.q3 - quatB.q3;
    return quatC;
}


void QuaternionLog(Quaternion quat2log)
{
    std::cout << "q0: " << quat2log.q0 << std::endl;
    std::cout << "q1: " << quat2log.q1 << std::endl;
    std::cout << "q2: " << quat2log.q2 << std::endl;
    std::cout << "q3: " << quat2log.q3 << std::endl;
}

int main()
{
    Quaternion quat1;
    Quaternion quat2(1, 2, 3, 4);
    Quaternion quat3 = quat1 + quat2;
    Quaternion quat4 = quat1 - quat2;

    QuaternionLog(quat1);
    QuaternionLog(quat2);
    QuaternionLog(quat3);
    QuaternionLog(quat4);
}

${ProjectRoot}/Quaternion.hpp

#ifndef QUATERNION_H
#define QUATERNION_H

class Quaternion 
{
public:

double q0{ 1.0 };
double q1{ 0.0 };
double q2{ 0.0 };
double q3{ 0.0 };

Quaternion();

Quaternion(double qs, double qi, double qj, double qk);

friend Quaternion operator + (Quaternion const &quatA, Quaternion const &quatB);

friend Quaternion operator - (Quaternion const &quatA, Quaternion const &quatB);

};

#endif /* QUATERNION_H */

${ProjectRoot}/test/CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

set(This QuaternionTests)

set(Sources
    QuaternionTest.cpp
)

add_executable(${This} ${Sources})

target_link_libraries(${This} PUBLIC
    gtest_main
    Quaternion
)

add_test(
    NAME ${This}
    COMMAND ${This}
)

${ProjectRoot}/test/QuaternionTest.cpp

#include <gtest/gtest.h>
#include "../Quaternion.hpp"

TEST(Quaternion, QuaternionConstructors)
{
    Quaternion test_quat_1;
    ASSERT_EQ(test_quat_1.q0, 1);
    ASSERT_EQ(test_quat_1.q1, 0);
    ASSERT_EQ(test_quat_1.q2, 0);
    ASSERT_EQ(test_quat_1.q3, 0);
    ASSERT_EQ(1,1);
};

int main(int argc, char **argv) 
{
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
};

我该怎么做:

  1. 确保并检查对象正在正确构建?
  2. 正确指示 CMake 以便链接器可以找到我的四元数(源代码)对象?

任何见解将不胜感激。

【问题讨论】:

  • A minimal reproducible example 不需要依赖外部链接(其中一些已经返回 404)
  • 欢迎来到 Stack Overflow!您的最后两个链接返回 404 not found,对我来说...您的问题帖子应包含所有必要的代码作为文本
  • 感谢指导,我已将链接替换为个别代码sn-ps中的源代码

标签: c++ visual-studio-code cmake linker googletest


【解决方案1】:

我的错误是错误地添加了我的库:
${ProjectRoot}/CMakeLists.txt

cmake_minimum_required(VERSION 3.16) # version can be different
set(CMAKE_VERBOSE_MAKEFILE ON)

set(This kepler)
get_filename_component(CODE_ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)

project(${This}) #name of your project

project(${This} C CXX)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

enable_testing()

add_subdirectory(googletest)
add_subdirectory(test)

set(Headers
    Quaternion.hpp
)

set(Sources
    Quaternion.cpp
)

add_library(${This} STATIC ${Sources} ${Headers})

我正在添加一个名为 ${THIS} 的库,它是“kepler”而不是预期的“四元数”,所以:

add_library(Quaternion STATIC ${Sources} ${Headers})

正确地告诉链接器期望我的库是什么/在哪里

在 Quaternion.cpp 中留下一个 main 函数,该函数已被移除

解决方案来源:vector-of-bool

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多