免责声明:我不是Linux上的Eclipse编码器,在无法为带有链接的共享库(英文为DLL)的简单EXE创建 shell 程序后,我将避免称其名称。

请耐心等待-我将详细描述我的工作...

如果有人能告诉我发生了什么,我将不胜感激。我在C / C++ Visual Studio中工作了数十年,但无法弄清楚这个中世纪工具(Eclipse)的发生了什么...

  • 我在Ubunty 18.04上安装了Eclipse 2019-x,还安装了CDT。
  • 我创建并构建了一个共享库,一个C++项目。该库具有C风格的API和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的控制台应用程序。
    我还在RLVTest2下创建了子目录'lib',并且在RLV2的构建后步骤中,我将文件libRLV2.so复制到了该'lib'
    它还可以建立。
    #include "Logger.h"
    #include "RLV2Shared.h"
    

    int ValidateCryptoLicense(const char * token ,char * signedMsg,int&signedMsgLen)
    {
    cout < LOG_INFO(“ValidateCryptoLicense已从外部模块调用\ n”);
    返回5;
    }

    RLV::RLV()
    {
    InitLogger();
    LOG_INFO("RLV class constructor has been called\n");
    

    }

    无效RLV::mRLV()
    {
    LOG_INFO(“RLV::mRLV函数已被调用)\ n”);

  • 然后我将共享库添加到exe项目:
    项目>属性> C++构建->设置-> GNCC C++链接器->库具有库的绝对路径。
    -L / home / leon / Projects / RLVTest2 / lib
    我还在C++常规>路径和符号>库路径下向库路径添加了相同路径。
    我还将libRLV2.so库添加到exe项目的C++常规>路径和符号>库

    这是建立exe的结果:

    建立目标:RLVTest2
    调用:GCC C++链接器
    g++ -L / home / leon / Projects / RLVTest2 / lib -pthread -o“RLVTest2” ./src/RLVTest2.o -llibRLV2.so
    / usr / bin / ld:找不到-llibRLV2.so
    collect2:错误:ld返回1退出状态
    makefile:48:目标“RLVTest2”的配方失败
    make:*** [RLVTest2]错误1
    “全部制作”以退出代码2终止。构建可能不完整。

    当在链接器中将库路径添加为完整路径时,它也会抱怨相同...

    建立目标:RLVTest2
    调用:GCC C++链接器
    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 / Projects / RLVTest2 / lib / libRLV2.so
    makefile:48:目标“RLVTest2”的配方失败
    collect2:错误:ld返回1退出状态
    make:*** [RLVTest2]错误1
    “全部制作”以退出代码2终止。构建可能不完整。

    最佳答案

    我无法描述我对Eclipse开发人员(创建者)的愤怒。
    我不在乎它是免费的-如果您做某事,就做对它-无需考虑:“我会做一些非常聪明的事情,以至于他们会为我建一座纪念碑”。

    当我将Project> Properties> C++ Build-> Settings-> GNCC C++ Linker-> Libraries(-l option)的内容更改为RLV2链接时,工作正常...

    09-08 11:32