c++ - 使用 gradle native 构建失败

标签 c++ visual-studio-2012 gradle

我正在尝试从 gradle 转移到 maven。这是我简单的 hello world 示例构建。我的 gradle.build 如下:-

apply plugin: 'cpp'

model {
    components {
    main(NativeExecutableSpec) {}
  }
}

我有一个cpp文件和一个h文件。目录结构如下:-

src/main/cpp/HelloWorld.cpp
src/main/headers/HelloWorld.h

我的头文件如下:-

// Hello.h

#if defined(_WIN32) && defined(DLL_EXPORT)
#define LIB_FUNC __declspec(dllexport)
#else
#define LIB_FUNC
#endif

class LIB_FUNC Hello
{
    private:
        const char * who;
    public:
        Hello(const char * who);
        void sayHello(unsigned n = 1);
};

我的来源如下:-

// main.cpp
#include "Hello.h"
int main(int argc, char ** argv)
{
    Hello hello ("Pepito");
    hello.sayHello(10);
    return 0;
}

当我尝试运行 gradle installMainExecutable 时出现以下错误:-

HelloWorld.obj : error LNK2019: unresolved external symbol "public: __thiscall Hello::Hello(char const *)" (??0Hello@@QAE@PBD@Z) referenced in function _main
HelloWorld.obj : error LNK2019: unresolved external symbol "public: void __thiscall Hello::sayHello(unsigned int)" (?sayHello@Hello@@QAEXI@Z) referenced in function _main

我正在使用 visual studio 2012 及其附带的任何 cl.exe。我让我的 friend 在 OSx 中用 clang++ 编译,它对他有用。我不知道怎么了。有人可以帮忙吗?

我的 gradle 版本:-

------------------------------------------------------------
Gradle 2.4
------------------------------------------------------------

Build time:   2015-05-05 08:09:24 UTC
Build number: none
Revision:     5c9c3bc20ca1c281ac7972643f1e2d190f2c943c

Groovy:       2.3.10
Ant:          Apache Ant(TM) version 1.9.4 compiled on April 29 2014
JVM:          1.8.0_45 (Oracle Corporation 25.45-b02)
OS:           Windows 7 6.1 amd64

最佳答案

我终于让它工作了。

DLL_EXPORT 符号的定义应按以下方式在 gradle 中完成:-

binaries.withType(NativeLibrarySpec) {
    if (toolChain in VisualCpp) {
         cCompiler.args "/Zi"
         cCompiler.define "DLL_EXPORT"
    }
}

这将确保 visual studio 选择正确的导出符号。默认情况下,所有符号都在 g++ 和 clang++ 中导出,因此不会在那里造成太多问题。但是您必须添加它以断言符号在链接阶段被导出。

感谢https://docs.gradle.org/current/userguide/nativeBinaries.html .每个人都应该非常彻底地阅读这份文件。

关于c++ - 使用 gradle native 构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31107783/

相关文章:

c++ - 为什么在 GCC 和 clang 之间编译的 c++17 lambda 有差异?

c++ - 类型 "char *"的参数与类型 "LPWSTR"的参数不兼容

c++ - 如何将 char* 转换为 LPCWSTR?

c# - UI 自动化是否有任何依赖项?

gradle - 当 gradle 5 预编译脚本插件位于包中时,如何才能使其正常工作

linux - gradle 构建在 Linux 中不起作用

c++ - 删除完整链表时的段错误

c++ - 使用 C++ 概念检查其他类型的函数是否存在

c++ - 从 Visual Studio 2012 项目创建 ".o"文件

gradle - findByName()方法为gradle插件任务返回null