Отказ от ответственности: я не являюсь Eclipse-кодером на Linux, и я воздержусь от того, чтобы называть его именами после того, как не смогу создать оболочку для простого EXE со связанной общей библиотекой (DLL в Engli sh).
Пожалуйста, наберитесь терпения - я подробно опишу то, что я сделал ...
Буду признателен, если кто-нибудь скажет мне, что происходит ... Я работал с C / C ++ Visual Studio десятилетиями, но не могу понять, что происходит в этом средневековом инструменте (Eclipse) ...
Я установил Eclipse 2019-x в Ubunty 18.04, а также установил CDT.
Я создал и создал общую библиотеку, проект C ++. Библиотека имеет API-стиль C и класс C ++. Он находится по адресу / home / leon / Projects / RLV2. Работает нормально.
RLV2Shared.h
#ifndef RLV2SHARED_H_
#define RLV2SHARED_H_
#include "Logger.h"
using namespace CPlusPlusLogging;
#include "shared_EXPORTS.h" // automatically generated by cmake
// by the GENERATE_EXPORT_HEADER macro
extern "C" int SHARED_EXPORT ValidateCryptoLicense(const char* token, char* signedMsg, int& signedMsgLen);
//extern "C" int ValidateCryptoLicense(const char* token, char* signedMsg, int& signedMsgLen);
class SHARED_EXPORT RLV
//class RLV
{
public:
CPlusPlusLogging::Logger* mpLogger = NULL; // Create the object pointer for Logger Class
RLV();
void mRLV();
void InitLogger();
};
#endif /* RLV2SHARED_H_ */
RLV2Shared. cpp
#include <string>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include "Logger.h"
#include "RLV2Shared.h"
using namespace CPlusPlusLogging;
using namespace std;
int ValidateCryptoLicense(const char* token, char* signedMsg, int& signedMsgLen)
{
cout << "!!!Hello from ValidateCryptoLicense!!!" << endl;
LOG_INFO("ValidateCryptoLicense has been called from external module\n");
return 5;
}
RLV::RLV()
{
InitLogger();
LOG_INFO("RLV class constructor has been called\n");
}
void RLV::mRLV()
{
LOG_INFO("RLV::mRLV function has been called)\n");
}
Я также создал и создал еще один простой проект на C ++ «Hello World», консольное приложение, расположенное по адресу / home / leon / Projects / RLVTest2. Я также создал subdir 'lib' в RLVTest2 и на этапе пост-сборки RLV2 я копирую файл libRLV2.so в этот 'lib'. Он также создает OK.
#include "Logger.h"
#include "RLV2Shared.h"
int ValidateCryptoLicense (const char * token, char * signatureMsg, int & signatureMsgLen) {cout << "!!! Привет от ValidateCryptoLicense !!!" << endl; LOG_INFO («ValidateCryptoLicense вызван из внешнего модуля \ n»); возврат 5; } </p>
RLV :: RLV () {InitLogger ();
LOG_INFO("RLV class constructor has been called\n");
}
void RLV :: mRLV () {LOG_INFO ("функция RLV :: mRLV был назван) \ n "); }
Затем я добавляю общую библиотеку в exe-проект: Project> Properties> C ++ Build -> Settings -> GN CC C ++ Linker -> Libraries и имеет абсолютный путь к библиотеке. -L / home / leon / Projects / RLVTest2 / lib Я также добавил тот же путь к пути к библиотеке в C ++ Общие> Путь и символы> Путь к библиотеке Я также добавил библиотеку libRLV2.so в C ++ Общие> Путь и символы> Библиотеки exe-проект
Вот результат сборки exe:
Цель создания: RLVTest2 Вызов: G CC C ++ Linker g ++ -L / home / leon / Projects / RLVTest2 / lib -pthread -o "RLVTest2" ./src/RLVTest2.o -llibRLV2.so / usr / bin / ld: не удается найти -llibRLV2.so collect2: ошибка: ld вернул 1 файл состояния завершения работы: 48: рецепт для цели 'RLVTest2' ошибка make: *** [RLVTest2] Ошибка 1 «make all» завершается с кодом выхода 2. Сборка может быть неполной.
При добавлении пути к библиотеке в компоновщике в качестве полного пути он также жалуется на то же .. .
Создание цели: RLVTest2 Вызов: G CC C ++ Linker g ++ -L / home / leon / Projects / RLVTest2 / lib -pthread -o "RLVTest2" ./src/RLVTest2.o -l / home /leon/Projects/RLVTest2/lib/libRLV2.so / usr / bin / ld: не удается найти -l / home / leon / Pr ojects / RLVTest2 / lib / libRLV2.so makefile: 48: сбой рецепта для цели 'RLVTest2' collect2: ошибка: ld вернул 1 состояние выхода make: *** [RLVTest2] Ошибка 1 «make all» прекращается с кодом выхода 2. Сборка может быть неполным.