Как связать объектный файл класса с исходным файлом

Я хочу знать, могу ли я связать и скомпилировать файл исходного кода с объектным файлом класса, не включая исходные файлы класса.

Или же

Как и в Java, я могу передать скомпилированный файл * .class другу и документу этого класса без предоставления исходного кода, и он может включить этот класс для своих нужд, не зная реального источника.

Могу ли я сделать то же самое с C ++? и как ?

К вашему сведению: я использую MinGW.

Я довольно новичок, так что это может выглядеть как глупый вопрос (но все же нет глупых вопросов).

0

Решение

В C ++ вы можете просто создать исполняемый файл (.exe в Windows, обычно без расширения в Linux) или библиотечный файл (.lib или .a) или общую библиотеку (.dll или .so) в зависимости от того, чего вы хотите достичь. ,

Если вы предоставляете библиотеку, вы должны будете также предоставить заголовочный файл с объявлениями класса. Если вы не хотите выдавать слишком много подробностей, у вас может быть класс «реализации», который просто является указателем на реализацию в вашем заголовочном файле, а реальная реализация доступна только вам как владельцу источники.

Для получения дополнительной информации вы должны искать «PIMPL», как предложил Томас Мэтьюз, — это сокращение от «Указатель на класс IMPLementation». По сути, ваш «публичный» класс — это просто оболочка, предоставляющая функции, которые вы хотите, чтобы другие видели, а класс реализации внутри него выполняет всю тяжелую работу.

Простой пример

В вашем заголовочном файле:

// Forward declaration of the implementation class.
class double_it_impl;

// Class that stores an integer, and doubles it each time you
// call doubling().
class Public_double_it
{
public:
public_double_it(int x);    // COnstructor.

int doubling();        // Function d

private:
double_it_impl *pImpl;
};

В вашем исходном или частном заголовочном файле мы объявляем фактическую реализацию:

class double_it_impl
{
public:
double_it_impl(int x) : m_x = x; {};
int doubling()  { m_x *= 2; return m_x; }

}public_double_it::public_double_it(int x)
{
pImpl = new public_double_it(x);
}

int public_double_it::doubling()
{
return pImpl->doubling();
}

Теперь вы не можете видеть, что содержит класс реализации или как он работает — конечно, это очень тривиальный пример, но я надеюсь, что он передает идею.

1

Другие решения

Вы можете дать им * .class, но они могут быть декомпилированы.

Большинство библиотек предоставляются с использованием классов и сгенерированных Javadoc.

0

Вы можете скомпилировать класс в библиотеку или dll или разделяемую библиотеку и подарить своему другу.

Им потребуется заголовочный файл, который определяет интерфейс.

Смотрите также идиома PIMPL.

0

Да, вы можете предоставить скомпилированный объектный файл и документацию, а другие могут связать файл .o (или .obj) со своим кодом. Точная информация о том, как это сделать, зависит от компилятора и среды разработки. Если вы используете g ++, вы просто используете следующую командную строку:

g++ -c source.cpp

Это создаст файл .o, который вы (или кто-либо еще) можете затем связать с другими файлами .o с помощью

g++ main.o source.o

Другие компиляторы будут иметь аналогичные параметры. Прочитайте файлы справки и другую документацию для получения инструкций о том, как создавать объектные файлы.

Для большого количества функций и / или классов, вы должны посмотреть на создание файла библиотеки. Они могут быть статически или динамически связаны. Я предлагаю вам поискать в Интернете дополнительную информацию, если вы хотите узнать о том, как создавать свои собственные библиотечные файлы.

0
По вопросам рекламы [email protected]