Невозможно связать методы C ++ в одном исходном файле с помощью Gradle - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь использовать 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 имеет открытый метод classB :: method1 (), который вызывает два закрытых метода classB :: method2 () и classB :: method3 ()

Когда япостроить, я получаю ошибку компоновщика, что он не может найти classB :: method2 () или classB :: method3 (). Я проверил сигнатуры методов, и все они совпадают (одинаковое количество и тип аргументов в classB.hpp, classB.cpp и в сообщении об ошибке компоновщика).

Я просмотрел документацию Gradle и все погуглилЯ могу придумать, перепробовал несколько вариантов файла build.gradle и ... Я не понимаю, почему компоновщик не может найти методы в одном и том же файле CPP ??

Сборка с Clang 11.0 наMacOS 10.14.6 в случае, если это имеет значение ...

Также для справки, вот соответствующие биты заголовочного файла:

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
}

1 Ответ

0 голосов
/ 18 октября 2019

О Боже мой! Просто ... Неважно. Вы знаете, как иногда публикации самого вопроса достаточно, чтобы сделать проблему очевидной?

Для записи, конечно, не хватает только идентификатора класса (извините, не могу вспомнить термин, я идуназад из Java) в начале имен методов в файле CPP. Они должны быть:

string& classB::method2(const string& s, bool b) {
 // blah
}

int classB::method3(uint16_t* b, const string& s) {
  // blah
}

Без вещей-идентификаторов классов компоновщик не осознает, что они являются функциями-членами, и не устанавливает соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...