Я хочу знать, могу ли я связать и скомпилировать файл исходного кода с объектным файлом класса, не включая исходные файлы класса.
Или же
Как и в Java, я могу передать скомпилированный файл * .class другу и документу этого класса без предоставления исходного кода, и он может включить этот класс для своих нужд, не зная реального источника.
Могу ли я сделать то же самое с C ++? и как ?
К вашему сведению: я использую MinGW.
Я довольно новичок, так что это может выглядеть как глупый вопрос (но все же нет глупых вопросов).
В 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();
}
Теперь вы не можете видеть, что содержит класс реализации или как он работает — конечно, это очень тривиальный пример, но я надеюсь, что он передает идею.
Вы можете дать им * .class, но они могут быть декомпилированы.
Большинство библиотек предоставляются с использованием классов и сгенерированных Javadoc.
Вы можете скомпилировать класс в библиотеку или dll или разделяемую библиотеку и подарить своему другу.
Им потребуется заголовочный файл, который определяет интерфейс.
Смотрите также идиома PIMPL.
Да, вы можете предоставить скомпилированный объектный файл и документацию, а другие могут связать файл .o (или .obj) со своим кодом. Точная информация о том, как это сделать, зависит от компилятора и среды разработки. Если вы используете g ++, вы просто используете следующую командную строку:
g++ -c source.cpp
Это создаст файл .o, который вы (или кто-либо еще) можете затем связать с другими файлами .o с помощью
g++ main.o source.o
Другие компиляторы будут иметь аналогичные параметры. Прочитайте файлы справки и другую документацию для получения инструкций о том, как создавать объектные файлы.
Для большого количества функций и / или классов, вы должны посмотреть на создание файла библиотеки. Они могут быть статически или динамически связаны. Я предлагаю вам поискать в Интернете дополнительную информацию, если вы хотите узнать о том, как создавать свои собственные библиотечные файлы.