问题标签 [static-libraries]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
14393 浏览

c# - .NET 等价于静态库?

我在托管代码(主要是 C++/CLI)中构建了一个工具,有两个版本,一个“普通用户”版本和一个“专业”版本。

两个版本之间的核心代码相同的事实给我带来了一些麻烦,因为我想将生成的工具打包为单个程序集 (DLL),并且我不想包含通用的 .cpp 文件两个版本工具的项目中的代码。我宁愿有一个用于公共代码的项目和一个用于每个版本的工具的项目,并且让每个版本的工具项目都依赖于公共代码并根据需要链接它。

在非托管 C++ 中,我会通过将公共代码放在静态库中并将工具的两个版本链接到它来做到这一点。我似乎无法让它在 C++/CLI 中工作。似乎我被迫将公共代码构建到 DLL 程序集中,这导致了比我想要的更多的 DLL。

因此,总而言之,我无法弄清楚如何在一个项目中构建公共代码并将其与每个最终产品项目链接以生成两个都包含公共代码的单个 DLL 程序集。

我可能做错了什么,但我试图弄清楚如何使用 netmodules 和其他东西来做到这一点,但我就是无法让它工作。最后,我让它工作的唯一方法是告诉链接器链接通用代码程序集的构建产品,而不是链接有效但有点像 hack 恕我直言的结果。

无论如何,有人对我应该如何解决这个问题有任何建议吗?

编辑:我想我应该提到这样一个事实,即生成的程序集不是 100% 托管代码,它们包含托管和非托管代码的混合,这可能与使用 C++/CLI 生成的程序集很常见......

0 投票
3 回答
131563 浏览

ubuntu - 试图包含一个库,但不断收到“未定义的引用”消息

我正在尝试使用 libtommath 库。我在 Ubuntu linux 上为我的项目使用 NetBeans IDE。我已经下载并构建了库,我已经完成了“make install”,将生成的 .a 文件放入 /usr/lib/ 并将 .h 文件放入 /usr/include

它似乎正确地找到了文件(因为我不再收到这些错误,这是我在安装到 /usr 目录之前所做的)。

但是,当我创建一个简单的 main 调用 mp_init (在库中)时,当我尝试创建我的项目时出现以下错误:

所以,看起来链接器在库中找不到函数,但它就在那里,所以我只是不知道是什么原因造成的。

如果我直接输入 gcc 命令并跳过 makefile,我会得到同样的错误,我还确保静态库也使用 gcc 编译。

编辑添加:

如果我直接进行编译并使用 -l 或 -L 添加库,我会得到这些相同的错误:

我对这些东西很生疏,所以我不确定我在这里使用了正确的命令,在 -L 示例中是否找到了库?如果找不到图书馆,我到底如何才能找到图书馆?它在 /usr/lib 中,我已经尝试使用当前目录中的 .a 文件等。是否需要设置环境变量?如果是,如何,等等。

我尝试了一个完全不同的库(GMP)并且遇到了完全相同的问题。这一定是某种 Ubuntu 环境问题?有人知道如何解决这个问题吗?

0 投票
1 回答
348 浏览

linux - 链接到 Boost 时如何知道何时使用 .a 或 .so?

我想为我正在处理的项目尝试 Boost::Serialization 库。我也在尝试习惯在 Linux 中编程。我在其默认位置设置了 boost。我尝试使用他们提供的命令行参数编译他们在此处提供的测试文件,并且效果很好。在此示例中,他们使用 .a 文件。

然后我转到序列化页面并尝试运行其中一个序列化演示。我运行了基本相同的命令,除了我换掉了文件名并链接到 libboost_serialization.a 而不是 libboost_regex.a,但我得到了一堆错误。在使用了不同的选项并仔细检查了目录之后,我终于通过将 .a 替换为 .so 文件来使其工作。

仅供参考,最终对我有用的是:

为什么我链接到 .a 文件的一个示例,而在另一个示例中我必须链接到 .so?

0 投票
1 回答
3527 浏览

c++ - CMake Visual Studio 将可执行文件与静态库链接

我有一个非常简单的(目前只是一个 main.cpp)CMake C++ 项目,我正在尝试在 Mac OS X 和 Windows 上构建它。它依赖于 libgsasl,我在两个平台上都将其编译为静态库。

Mac OS X 在构建过程中没有问题,Windows 在构建过程中也不会抱怨并生成 EXE。当我尝试在 Windows 上运行 EXE 时,它会给出一条错误消息,指出应用程序无法运行,因为它找不到 libgsasl.dll。

我什至没有尝试链接动态库,只是静态库(.lib 版本)。我错过了什么吗?在 Visual Studio 中,看起来 gsasl.lib 文件已找到并包含在链接命令中。

0 投票
3 回答
19135 浏览

c - 将共享库与静态库链接:静态库的编译方式必须与应用程序链接它的方式不同吗?

至少在 Linux 和 Solaris 上,静态库实际上只是一堆已编译的 .o 文件,它们被扔进一个大文件中。编译静态库时,通常会省略 -fpic 标志,因此生成的代码是位置相关的。

现在说我的静态库是 B。我已经构建了它并得到了生成的 .a 文件,它实际上只是所有与位置相关的 .o 文件的全局。现在我有一个我想构建的共享库A,我希望它静态链接B。当我构建A时,我自然会使用-fpic标志来使生成的代码位置独立。但是如果我链接到 B,我不是混合了位置相关和位置无关的目标文件吗?

除非我还指定 -mimpure-text,否则我会收到很多文本重定位错误,我认为这可能是原因。看来我编译一个库的时候,真的需要编译3次,一个共享版本,一个静态版本,一个static-that-c​​an-be-used-by-shared-libs版本。我对吗?我可以继续使用 -mimpure-text 但 g++ 手册页说,如果你这样做,对象实际上并没有最终被共享(不清楚它是全部未共享还是只是静态链接的部分,有人知道吗?) .

0 投票
5 回答
10629 浏览

c - 如何在静态库中存储版本号?

如何将版本号存储在静态库 (file.a) 中,然后在 Linux 中检查其版本?

PS 我需要随时检查文件版本的可能性,而无需任何特殊的可执行文件,仅使用 shell 实用程序。

0 投票
3 回答
2888 浏览

c++ - 静态库文件中的资源 - MFC

MFC 似乎无法启动我的对话框,因为它找不到资源标识符。对话框位于一个单独的 .lib 文件中(因此它有一个单独的 .rc 文件,我假设它与我的 .exe 文件中的文件有某种冲突)。我应该如何处理这种情况?

0 投票
1 回答
1221 浏览

iphone - 在 iPhone 上使用 CHDataStructures.framework

我是 iPhone 编程的新手,我正在尝试在我的项目中使用CHDataStructures。但我遇到了一些问题:

  1. 当我在下载后直接尝试构建它时,我收到错误“Foundation/Foundation.h”没有这样的文件或目录。Active SDK 是“Use Base SDK”,活动架构是 x86_64。我相信我应该将 Active SDK 设置为 iPhone SDK,但它没有在那里列出;

  2. 在某些时候(我不记得如何)我设法对其进行了调整,并且在活动 SDK 中获得了 iPhone SDK(模拟器),但是当我尝试构建它时,出现以下错误:“目标指定产品类型 'com. apple.product-type.framework',但 'iphonesimulator' 平台没有这样的产品类型”;

现在我被困住了。我究竟做错了什么?

在此先感谢,努诺

0 投票
5 回答
107103 浏览

c - 如何链接到 C 中的静态库?

我使用 code::blocks 来编译我的静态库。输出结果是一个 libstatic.a 文件。现在,如何链接到我的库以使用已编译的函数?

(我尝试使用 #include "libstatic.a" 但我的项目无法编译)

0 投票
8 回答
16512 浏览

iphone - iPhone静态库中的核心数据

我构建了一个大量使用 Core Data 框架的静态库。我可以在我的外部项目中成功使用该库,但前提是我在主项目中包含 .xcdatamodel 文件。这不太理想,因为库的目的是尽可能隐藏实现细节。

在一个单独的问题中,我被告知我不能将资源与库捆绑在一起(现在这对我来说完全有意义)。

那么有没有办法以编程方式让模型被“发现”而不必将模型包含在主项目中?