我正试图从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附带的任何内容。我让我的朋友在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
答案 0 :(得分:2)
我终于开始工作了。
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。每个人都应该非常彻底地阅读这份文件。