如果它们都包含已编译的代码,为什么我们不能在运行时加载"静态"文件,为什么我们不能在编译时链接动态库?为什么需要单独的格式来包含"独立"代码?什么需要存储哪个保证差异?
我是一名C++初学者,我正在研究该语言的基础知识.我的书中有一个关于编译器的主题,我的问题是我无法理解文本想要说的内容:
C++是一种编译语言,因此您需要将源代码转换为计算机可以执行的文件.该文件由编译器生成,称为目标代码(.obj),但像"hello world"程序这样的程序由我们编写的部分和C++库的一部分组成.链接器链接程序的这两部分并生成可执行文件(.exe).
为什么我的书告诉计算机执行的文件是带有obj后缀的文件(目标代码),然后说它是带有exe后缀的文件?
我读过这.so是一个动态库文件,.a是一个静态库文件.
虽然构建openssl我给了选项./Configure no-shared,它创建了很多.a文件.
所以,我的问题是像apache这样的其他软件包是否可以使用.aopenssl中的文件?
例如libcrypto.a,
如果我正走错路,请有人建议我.
共享库(.so)文件是否需要在链接时显示(或指定)?
我在这里已经读到了(共享对象(.so),静态库(.a)和DLL(.so)之间的区别?),. so文件必须在编译时出现,但是根据我的经验,这不是真的吗?
共享库不是仅在运行时使用dlopen和链接dlsym,以便在链接应用程序时该库可能不存在于系统上吗?
我是 C++ 语言的新手。当我开始构建一个新项目时,我可以看到两个选项。C++ 可执行文件和 C++ 库。
我尝试在很多地方寻找它们的差异,但什么也没得到。有人可以指导我找到关于这个主题的正确答案吗?
谢谢
我有一个库,在编译时正在构建一个名为libEXAMPLE.so(在so.le文件夹中)的共享对象,以及一个名为EXAMPLE.so的dll(在dll文件夹中).这两个共享对象的大小非常相似,看起来完全相同.搜索互联网时发现,程序使用dll进行符号解析的方式与使用共享对象的方式有所不同.
你能帮助我理解这个吗?
在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。
注意:我并不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分割线是在Windows C ++和Linux C ++之间。
我有一个项目来编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他可以在自己的代码中调用该函数。是否可以?我想到了这两种方法 -
请告诉我这些是否可行,并给我一个方法。
我正在将 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() 调用,那么我需要一些关于从哪里开始的指针。