c++ - 未找到 Gtest 入口点
问题描述
我正在尝试使用 gtest 来测试共享库。我使用 CMake 并且每次构建和编译都没有任何错误,但是 hello_test.exe 退出并出现错误:
未找到入口点。在动态链接库中找不到过程入口点 _ZNKSt7__cxx112basic_stringlcSt11char_traitslcESalcEE4findEPKcyy。
我在通过 rdp 连接的 Windows Server 2016 Standard 上(看起来像 windows10)
我使用 MinGW 8.1.0 (x86_64/win32/seh) 作为编译器。
CMake 3.17.3
我试图在另一台计算机上复制这个环境并且一切正常,所以我需要一些帮助来找到这个环境中缺少的东西,以便我可以修复它。
我看过这个问题
在动态链接库中找不到过程入口点_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev
但我查了一下,我的 cxx 编译器是 g++
-
这个答案有效,但为什么 cmake 没有正确链接呢?
这是 MWE。cmake 文件夹包含 https://github.com/robotology/idyntree/tree/master/cmake中的两个实用程序
- 安装基本包文件
- 添加InstallRPATH支持
CMakeLists.txt
cmake/
include/
hello.h
src/
CMakeLists.txt
hello.c
test/
CMakeLists.txt
main_test.cpp
hello_test.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.14...3.17 FATAL_ERROR)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
project(hello
LANGUAGES CXX C
VERSION 1.2.3
DESCRIPTION "hello project"
)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_EXTENSIONS OFF)
include(GNUInstallDirs)
set(BUILD_DIR ${CMAKE_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_DIR}/${CMAKE_INSTALL_BINDIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_DIR}/${CMAKE_INSTALL_LIBDIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BUILD_DIR}/${CMAKE_INSTALL_LIBDIR}")
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} CACHE PATH "..." FORCE)
endif()
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
enable_testing()
include(AddInstallRPATHSupport)
add_install_rpath_support(BIN_DIRS "${CMAKE_INSTALL_FULL_BINDIR}"
LIB_DIRS "${CMAKE_INSTALL_FULL_LIBDIR}"
INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}"
USE_LINK_PATH)
add_subdirectory(${PROJECT_SOURCE_DIR}/src)
include(InstallBasicPackageFiles)
install_basic_package_files(${PROJECT_NAME}
VERSION ${${PROJECT_NAME}_VERSION}
COMPATIBILITY AnyNewerVersion
VARS_PREFIX ${PROJECT_NAME}
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
add_subdirectory(${PROJECT_SOURCE_DIR}/test)
包括/你好.h
#ifndef HELLO_INCLUDE_HELLO_H
#define HELLO_INCLUDE_HELLO_H
#ifdef __cplusplus
extern "C" {
#endif
void sayHello(char *tag);
#ifdef __cplusplus
} // extern "C"
#endif
#endif //HELLO_INCLUDE_HELLO_H
src/CmakeLists.txt
set(LIBRARY_TARGET_NAME ${PROJECT_NAME})
set(${LIBRARY_TARGET_NAME}_SRC
${CMAKE_SOURCE_DIR}/src/hello.c
)
set(${LIBRARY_TARGET_NAME}_HDR
${CMAKE_SOURCE_DIR}/include/hello.h
)
add_library(${LIBRARY_TARGET_NAME} SHARED ${${LIBRARY_TARGET_NAME}_SRC} ${${LIBRARY_TARGET_NAME}_HDR})
set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES VERSION ${${PROJECT_NAME}_VERSION}
PUBLIC_HEADER "${${LIBRARY_TARGET_NAME}_HDR}")
set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES PREFIX "")
target_include_directories(${LIBRARY_TARGET_NAME} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>/include"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>"
)
install(TARGETS ${LIBRARY_TARGET_NAME}
EXPORT ${PROJECT_NAME}
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" COMPONENT dev)
message(STATUS "Created target ${LIBRARY_TARGET_NAME} for export ${PROJECT_NAME}.")
源代码/你好.c
#include <hello.h>
#include <stdio.h>
void sayHello(char *tag) {
printf("%s: Hello!\n", tag);
};
测试/CMakeLists.txt
set(TEST_TARGET_NAME hello_test)
set(${TEST_TARGET_NAME}_SRC
${CMAKE_SOURCE_DIR}/test/main_test.cpp
${CMAKE_SOURCE_DIR}/test/hello_test.cpp
)
set(GTEST_LOCAL //path/to/local/google/test/repo)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY ${GTEST_LOCAL}
GIT_TAG release-1.10.0
)
FetchContent_MakeAvailable(googletest)
list(APPEND EXTRA_LIBS
hello
gtest_main
)
list(APPEND EXTRA_INCLUDES
${CMAKE_BINARY_DIR}/include
)
add_executable(${TEST_TARGET_NAME} ${${TEST_TARGET_NAME}_SRC})
target_link_libraries(${TEST_TARGET_NAME} PUBLIC ${EXTRA_LIBS})
target_include_directories(${TEST_TARGET_NAME} PUBLIC
${EXTRA_INCLUDES}
)
add_test(NAME ${TEST_TARGET_NAME}
COMMAND ${TEST_TARGET_NAME}
WORKING_DIRECTORY $<TARGET_FILE_DIR:${TEST_TARGET_NAME}>)
测试/main_test.cpp
#include <gtest/gtest.h>
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
测试/hello_test.cpp
#include <gtest/gtest.h>
#include <hello.h>
TEST(ExpectTrue1, test1) {
EXPECT_TRUE(1);
}
TEST(ExpectTrue2, test2) {
EXPECT_TRUE(0);
}
解决方案
推荐阅读
- php - MySQL vs Firebird:使用 PDO 访问 PHP 中的查询列
- user-interface - UI如何评估?
- iphone - 创建新会话是不可能的,因为“createSession”需要 HttpClient,
- angular - Angular FormGroup valueChanges 将属性转换为数组
- java - 我在 android apk 中执行命令,但我无法获得正确的返回
- windows - 使用 Windows 默认凭据的 UWP NTLM 身份验证
- javascript - 如何在javascript中找到程序的类和函数的行号
- azure-active-directory - 在使用 Directory.AccessAsUser.All 的本机应用程序中是否需要管理员同意?
- javascript - 在angularjs中突出显示从一个列表框移动到另一个列表框的项目
- c# - 合并两个 XDocument