我正在尝试使用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/

10-12 06:06