如何解决为什么我的Gradle C ++项目会出现“无法解析的外部符号”?
所以我很无聊,无法理解如何使CMake正常工作,并且想搬到我觉得更漂亮的东西上。这就是为什么我要在此C ++项目中使用Gradle的原因。
我正在尝试在名为GameEngine
的新C ++应用程序项目中使用我的C ++库GameEngineGame
。 GameEngine
库已成功构建,并已与Gradle一起发布到本地Maven存储库中,该存储库位于CPPMavenRepo
环境变量定义的位置(由System.getenv('CPPMavenRepo')
读取)。
当我尝试在gradle build
项目中运行GameEngineGame
时,已找到依赖项,但是在链接阶段,我以某种方式收到一条错误消息,告诉我我有未解析的外部符号。
$ gradle build
> Task :linkTest FAILED
Main.obj : error LNK2019: unresolved external symbol "public: static class Engine::Engine & __cdecl Engine::Engine::get(void)" (?get@Engine@1@SAAEAV11@XZ) referenced in function main
G:\<redacted>\GameEngineGame\build\exe\test\GameEngineGameTest.exe : fatal error LNK1120: 1 unresolved externals
> Task :linkDebug FAILED
Main.obj : error LNK2019: unresolved external symbol "public: static class Engine::Engine & __cdecl Engine::Engine::get(void)" (?get@Engine@1@SAAEAV11@XZ) referenced in function main
G:\<redacted>\GameEngineGame\build\exe\main\debug\GameEngineGame.exe : fatal error LNK1120: 1 unresolved externals
FAILURE: Build completed with 2 failures.
1: Task failed with an exception.
[...]
Main.cpp
文件中的代码很短。我仅调用静态函数Engine::Engine::get()
并声明结构Component::Position p
。后者不会产生任何错误,但是第一行会造成错误,因为库中缺少共享对象。
#include <iostream>
#include <Engine/Engine.hpp>
#include <Component/Position.hpp>
int main(int,char**) {
Engine::Engine& e = Engine::Engine::get();
Component::Position p;
std::cout << "Hello,world!\n";
}
因此,找到了所有标头(我确定是标头),但是“链接时链接器失败”,因此我没有与该函数关联的任何二进制文件。我推断dll / lib文件没有提供给链接器,但是我找不到这种情况,在这种情况下如何解决。我想我在build.gradle
中遗漏了一些东西,但是找不到。网上几乎没有帮助,可惜。
您可以在build.gradle
C ++应用程序项目的GameEngineGame
文件下面找到该文件。
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample C++ project to get you started.
* For more details take a look at the Building C++ applications and libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.6.1/userguide/building_cpp_projects.html
*/
plugins {
// Apply the cpp-application plugin to add support for building C++ executables
id 'cpp-application'
// Apply the cpp-unit-test plugin to add support for building and running C++ test executables
id 'cpp-unit-test'
}
repositories {
maven {
url = System.getenv('CPPMavenRepo')
}
}
// Set the target operating system and architecture for this application
application {
targetMachines.add(machines.windows.x86_64)
dependencies {
implementation 'com.sample:GameEngine:0.0.1'
}
}
顺便说一句,正如您在注释中所看到的,我在这个项目中使用gradle init
并为C ++应用程序准备了配置。对于库,我也使用了它,但是使用了C ++库的配置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。