我正在尝试使用Gradle(5.6.2)构建基本的C++库,但无法弄清这里出了什么问题。我开始使用Gradle init创建基本结构...这是我的build.gradle:
plugins {
// Apply the cpp-library plugin to add support for building C++ libraries
id 'cpp-library'
// Apply the cpp-unit-test plugin to add support for building and running C++ test executables
id 'cpp-unit-test'
}
// Set the target operating system and architecture for this library
library {
targetMachines.add(machines.macOS.x86_64)
dependencies {
implementation files('/usr/local/lib/libjsoncpp.a') // used by classA
}
}
tasks.withType(CppCompile).configureEach {
compilerArgs.add "-std=c++11"
compilerArgs.add "-w"
}
源代码树如下所示:
src/main/cpp -> classA.cpp classB.cpp classB.hpp hello.cpp
src/main/public -> classA.hpp cppd.h cpplib.h
src/test/cpp -> classATest.cpp hello_test.cpp
hello.cpp,cppd.h,cpplib.h和hello_test.cpp都来自“gradle init”,实际上并未使用。
classA在classB中调用一些方法。 classB仅取决于标准库。
classB有一个公共(public)方法classB::method1(),它调用两个私有(private)方法classB::method2()和classB::method3()
在构建时,出现一个链接器错误,它找不到classB::method2()或classB::method3()。我检查了方法签名,它们全部匹配(classB.hpp,classB.cpp和链接器错误消息中的参数数目和类型相同)。
我已经搜索了Gradle文档,并搜索了我能想到的所有内容,在build.gradle文件上尝试了几种变体,并且...我不明白为什么链接程序无法在同一CPP文件中找到方法?
在重要的情况下在MacOS 10.14.6上使用Clang 11.0进行构建...
还要引用,这是头文件的相关位:
class classB {
public:
method1();
private:
string& method2(const string& s, bool b);
int method3(uint16_t* b, const string& s);
}
以及来自cpp文件的方法:
string& method2(const string& s, bool b) {
// blah
}
int method3(uint16_t* b, const string& s) {
// blah
}
最佳答案
哦,我的天啊!只是...没关系。您知道有时发布问题本身足以使问题变得明显吗?
记录下来,当然缺少的是CPP文件中方法名称前面的类标识符(很抱歉,我想不起来了,我是从Java回来的)。他们应该是:
string& classB::method2(const string& s, bool b) {
// blah
}
int classB::method3(uint16_t* b, const string& s) {
// blah
}
没有类标识符的东西,链接器就不会意识到它们是成员函数,也不会建立连接。
关于c++ - 无法使用Gradle在同一源文件中链接C++方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58455390/