相关疑难解决方法(0)

为什么静态和动态可链接库不同?

如果它们都包含已编译的代码,为什么我们不能在运行时加载"静态"文件,为什么我们不能在编译时链接动态库?为什么需要单独的格式来包含"独立"代码?什么需要存储哪个保证差异?

language-agnostic linker loader

28
推荐指数
3
解决办法
1886
查看次数

代码对象和可执行文件之间的区别

我是一名C++初学者,我正在研究该语言的基础知识.我的书中有一个关于编译器的主题,我的问题是我无法理解文本想要说的内容:

C++是一种编译语言,因此您需要将源代码转换为计算机可以执行的文件.该文件由编译器生成,称为目标代码(.obj),但像"hello world"程序这样的程序由我们编写的部分和C++库的一部分组成.链接器链接程序的这两部分并生成可执行文件(.exe).

为什么我的书告诉计算机执行的文件是带有obj后缀的文件(目标代码),然后说它是带有exe后缀的文件?

c++ linker

24
推荐指数
3
解决办法
3万
查看次数

.so文件和.a文件之间的区别?

我读过这.so是一个动态库文件,.a是一个静态库文件.

虽然构建openssl我给了选项./Configure no-shared,它创建了很多.a文件.

所以,我的问题是像apache这样的其他软件包是否可以使用.aopenssl中的文件?

例如libcrypto.a,

如果我正走错路,请有人建议我.

linux apache static openssl dynamic

10
推荐指数
1
解决办法
9492
查看次数

共享库(.so)文件是否需要在链接时显示(或指定)?

共享库(.so)文件是否需要在链接时显示(或指定)?

我在这里已经读到了(共享对象(.so),静态库(.a)和DLL(.so)之间的区别?),. so文件必须在编译时出现,但是根据我的经验,这不是真的吗?

共享库不是仅在运行时使用dlopen和链接dlsym,以便在链接应用程序时该库可能不存在于系统上吗?

c++ dll shared-libraries

6
推荐指数
1
解决办法
2248
查看次数

Clion C++ 可执行文件与 C++ 库

我是 C++ 语言的新手。当我开始构建一个新项目时,我可以看到两个选项。C++ 可执行文件和 C++ 库。

我尝试在很多地方寻找它们的差异,但什么也没得到。有人可以指导我找到关于这个主题的正确答案吗?

谢谢

以供参考

c++ executable c++11 c++14

5
推荐指数
1
解决办法
5751
查看次数

共享对象和DLL之间的区别

我有一个库,在编译时正在构建一个名为libEXAMPLE.so(在so.le文件夹中)的共享对象,以及一个名为EXAMPLE.so的dll(在dll文件夹中).这两个共享对象的大小非常相似,看起来完全相同.搜索互联网时发现,程序使用dll进行符号解析的方式与使用共享对象的方式有所不同.

你能帮助我理解这个吗?

c c++ dll shared-libraries

4
推荐指数
1
解决办法
4956
查看次数

相当于Linux中的导入库

在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。

注意:我并不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分割线是在Windows C ++和Linux C ++之间。

c++ linux windows gnu

2
推荐指数
2
解决办法
886
查看次数

C/C++ - 对其他人隐藏 C 或 C++ 函数代码

我有一个项目来编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他可以在自己的代码中调用该函数。是否可以?我想到了这两种方法 -

  • 在某个服务器上托管该功能(如果可能)并为雇主提供一个 URL 以访问它。
  • 密码保护函数代码文件(同样,如果可能的话)并且只允许访问在代码中调用它。

请告诉我这些是否可行,并给我一个方法。

c c++

1
推荐指数
1
解决办法
5324
查看次数

在 Windows 到 Linux 项目转换中绕过 __declspec(dllimport)

我正在将 Visual Studio C++ 框架转换为 Linux 版本,并且在消除 Windows 依赖项的过程中,我在一些头文件中遇到了一大堆 __declspec(dllimport) 调用。这些头文件定义了源文件中使用的一堆函数和类,因此构建需要它们。

下面是使用 __declspec() 调用的确切行。

#ifndef UeiDaqAPI
    #define UeiDaqAPI __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

UeiDaqAPI 是所有源文件使用的类和函数的集合。据我了解, declspec 调用将当前 .h 文件中定义的函数/类链接到动态库“UeiDaqAPI”

Linux 不支持 __declspec(dllimport),因此我尝试使用 dlopen() 进行“解决方法”。有关更多背景信息,大约 40 个头文件使用上面的 __declspec() 调用,因此测试任何解决方法都非常乏味。我得到了一个 Linux 动态库,采用我应该使用的 .so 格式。

我找到了一个使用 dlopen(path-to-library) 的示例,它应该允许我绕过 __declspec() 调用,但我不确定如何让它正常工作。到目前为止,我已尝试遵循该示例,并更改了所有 40 个左右的头文件,并将 __declspec() 调用替换为以下内容:

#ifndef UeiDaqAPI
    string nameOfLibToLoad("path/to/lib/lib.so");
    UeiDaqAPI = dlopen(nameOfLibToLoad.c_str(), RTLD_LAZY);
    if (!lib_handle) {
        cerr << "Cannot load library: " << dlerror() << endl;
    }
#endif
Run Code Online (Sandbox Code Playgroud)

然而,我收到错误消息,指出头文件中定义的函数调用未定义,我怀疑这是因为它们没有添加到 .so 库中,但我不确定。

我需要一些帮助来实现上述解决方法,或者,如果有更好的方法来绕过 __declspec() 调用,那么我需要一些关于从哪里开始的指针。

c++ linux dynamic-library

1
推荐指数
1
解决办法
2059
查看次数