c++ - gtest 编译期间的 Cmake 错误 - gtest/internal/gtest-type-util.h:732:25:错误:预期的类型说明符
问题描述
我在尝试使用 cmake 构建项目时遇到错误。
我在我的电脑上手动下载并安装了 gtest(即 /usr/include 中提供了 gtest 头文件)和 /usr/lib 中的 gtest、gtest_main 等库)
下面是我的项目主要功能的代码。(lte_softmodem_test.cpp)
#include <gtest/gtest.h>
#include <iostream>
using namespace std;
TEST(sample, sample2){
}
int main(int argc, char **argv)
{
cout << "This is test" << endl;
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
return 0;
}
当我使用以下命令单独编译此文件时,它正在工作!
g++ eNB_scheduler_test.cpp -L /usr/lib/ -lgtest -lgtest_main -pthread -std=c++11
但是,当我尝试将其包含在我的项目 CMake 文件中时,它向我显示了一个错误。
CMake 文件:(CMake 文件有点大,所以我只包含了几行我试图编译这个文件的地方)
# lte-softmodem is both eNB and UE implementation
###################################################
add_executable(lte-softmodem
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
${OPENAIR_TARGETS}/RT/USER/ru_control.c
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
${OPENAIR_TARGETS}/RT/USER/lte-softmodem_test.cpp
${OPENAIR_TARGETS}/RT/USER/lte-softmodem-common.c
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
${OPENAIR_TARGETS}/COMMON/create_tasks.c
${OPENAIR_TARGETS}/COMMON/create_tasks_mbms.c
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c
${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag)
target_link_libraries (lte-softmodem
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} LFDS7
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl gtest gtest-main -lpthread)
编译文件 lte_softmodem_test.cpp 时以详细模式输出 CMake:
/usr/bin/c++ -DASN1_MINIMUM_VERSION=924 -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DDRIVER2013 -DENABLE_ITTI -DENABLE_NAS_UE_LOGGING -DENABLE_USE_CPU_EXECUTION_TIME -DENABLE_USE_MME -DENABLE_VCD -DENB_MODE -DEXMIMO_IOT -DF1AP_RELEASE=R15 -DF1AP_VERSION=3873 -DFIRMWARE_VERSION=""No svn information"" -DFLPT_VERSION=V2 -DFSPT_VERSION=V2 -DJUMBO_FRAME -DLTE_RRC_VERSION=3696 -DM2AP_RELEASE=R14 -DM2AP_VERSION=3584 -DM3AP_RELEASE=R14 -DM3AP_VERSION=3584 -DMAX_NUM_CCs=1 -DNAS_BUILT_IN_UE -DNAS_UE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=4 -DNETTLE_VERSION_MAJOR=3 -DNETTLE_VERSION_MINOR=2 -DNO_RRM -DNUMBER_OF_UE_MAX_NB_IoT=16 -DNone=1 -DOAI_NW_DRIVER_USE_NETLINK -DOPENAIR2 -DOPENAIR_LTE -DPACKAGE_BUGREPORT="openair4g-devel@lists.eurecom.fr" -DPACKAGE_NAME="" -DPACKAGE_VERSION=""分支:master Abrev. 哈希:
错误日志:
<command-line>:0:6: error: expected identifier before numeric constant
<command-line>:0:6: error: expected unqualified-id before numeric constant
<command-line>:0:6: error: expected type-specifier before numeric constant
<command-line>:0:6: error: expected type-specifier before numeric constant
In file included from /usr/local/include/gtest/gtest.h:62:0,
from /root/openairinterface5g/targets/RT/USER/lte-softmodem_test.cpp:2:
/usr/local/include/gtest/internal/gtest-internal.h:690:39: error: variable or field ‘GenerateNamesRecursively’ declared void
void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}
^
<command-line>:0:6: error: expected unqualified-id before numeric constant
In file included from /usr/local/include/gtest/gtest.h:62:0,
from /root/openairinterface5g/targets/RT/USER/lte-softmodem_test.cpp:2:
/usr/local/include/gtest/internal/gtest-internal.h:690:71: error: expected primary-expression before ‘*’ token
void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}
^
/usr/local/include/gtest/internal/gtest-internal.h:690:72: error: expected primary-expression before ‘,’ token
void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}
^
/usr/local/include/gtest/internal/gtest-internal.h:690:74: error: expected primary-expression before ‘int’
void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}
^
/usr/local/include/gtest/internal/gtest-internal.h:757:61: error: template argument 3 is invalid
class TypeParameterizedTest<Fixture, TestSel, internal::None> {
^
/usr/local/include/gtest/internal/gtest-internal.h:815:64: error: wrong number of template arguments (2, should be 3)
class TypeParameterizedTestSuite<Fixture, internal::None, Types> {
^
/usr/local/include/gtest/internal/gtest-internal.h:778:7: note: provided for ‘template<template<class T> class Fixture, class Tests, class Types> class testing::internal::TypeParameterizedTestSuite’
class TypeParameterizedTestSuite {
编辑:
我已经使用错误日志编辑了问题,并在编译文件时进行了输出。提前感谢您抽出宝贵的时间。
解决方案
这就是我个人以干净的方式包含 Google Test 的方式:
# To prevent overriding the parent project's compiler/linker settings on Windows.
if(WIN32)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
endif()
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG master
SOURCE_DIR "${GOOGLETEST_DOWNLOAD_DIR}/src" # choose preferred directory
BINARY_DIR "${GOOGLETEST_DOWNLOAD_DIR}/bin"
)
FetchContent_MakeAvailable(googletest)
#gtest and gtest-main will be available here
您还可以将 FindGTest.cmake 模块与 find_package 函数一起使用,确保定义环境变量 GTEST_ROOT。如果这些方法可以工作,而您的方法不能工作,那么它可能是您通过 cmake 设置的链接器(检查语法错误)。
推荐阅读
- rabbitmq - 我如何使用 amqpnetlite dll 连接到 rabbitmq
- javascript - Asp.net core mvc中表单的提交按钮在使用javascript创建动态DOM后突然停止工作
- swift - 如何为日语设置系统字体?
- c++ - 为什么一个 ostream << 重载工作,而另一个不工作?
- oracle - 对 Oracle 上的插入/删除/选择性能进行故障排除
- stack - 如何在堆栈中编写推送和弹出函数?在 C 中
- python - 如何在 Kivy 中删除动态添加的项目
- c# - 在 c# 中,哈希表键和值出现错误
- reactjs - 在我不使用任何列表时收到警告唯一密钥道具
- sql - 如何获取全名作为别名并在 Like 语句中使用它