gpt4 book ai didi

c++ - 无法在 Ubuntu 上将共享库与 Eclipse 链接

转载 作者:行者123 更新时间:2023-12-02 10:35:56 39 4
gpt4 key购买 nike

免责声明:我不是 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 << "!!!来自 ValidateCryptoLicense 的您好!!!"< LOG_INFO("ValidateCryptoLicense 已从外部模块调用\n");
    返回 5;
    }

    RLV::RLV()
    {
    初始化记录器();
    LOG_INFO("RLV class constructor has been called\n");

    }

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

  • 然后我将共享库添加到 exe 项目:
    Project > Properties > C++ Build -> Settings -> GNCC C++ Linker -> Libraries 有库的绝对路径。
    -L/home/leon/Projects/RLVTest2/lib
    我还在 C++ General > Path and Symbols > Library Path 下的库路径中添加了相同的路径
    我还将 libRLV2.so 库添加到 exe 项目的 C++ General > Path and Symbols > Libraries

    下面是构建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
    “make all”以退出代码 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
    “make all”以退出代码 2 终止。构建可能不完整。

    最佳答案

    我无法描述我对 Eclipse 开发人员(创建者)的愤怒程度......
    我不在乎它是免费的——如果你做某事,就做对——不假思索:“我会做一些如此聪明的事情,以至于他们会为我 build 一座纪念碑”......

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

    关于c++ - 无法在 Ubuntu 上将共享库与 Eclipse 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60292519/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com