【问题标题】:Archiving Two .a files归档两个 .a 文件
【发布时间】:2013-05-24 21:32:36
【问题描述】:

我有一个可以用-D UNICODE编译的C++项目。

当我在没有定义的情况下编译它时,它会创建一堆目标文件,然后我使用以下命令将它们添加到 .a 存档文件中:ar.exe rcs Cpplib.a *.o

然后我使用该定义编译它并使用:ar.exe rcs CpplibU.a *.o 归档对象

U 表示存档是 Unicode 的。

有没有一种方法可以将两个 .a 文件合并到一个存档中,这样我就可以链接到该文件,而不必链接到:

Cpplib_x32.a Cpplib_x64.a Cpplib_x32U.a Cpplib_x64U.a

现在我不介意分别链接到 x32 和 x64,但必须链接到 2 个 x64 和 2 个 x32 有点烦人。

我想知道是否有一种方法可以合并 x32 和 x64 档案或合并非 Unicode 和 Unicode 档案。我两个都不需要。要么,要么。

有什么想法还是我不得不链接到所有 4 个?

【问题讨论】:

  • "而不是链接到:" 你怎么能链接到所有这些呢?它们是相互排斥的,是吗?如果您正在编译 32 位,则无法链接到使用 64 位编译构建的库。如果你正在为 Unicode 编译,链接到非 Unicode 编译库是危险的。就像在发布版本中链接到为调试而编译的库一样,反之亦然。
  • 不,先生。我链接到所有这些,Mingw/Codeblocks 允许它。它只使用适合的那个。换句话说,如果我正在编译一个没有 Unicode 的项目,Mingw 不知何故知道使用非 Unicode 项目并忽略其他所有项目,而不会使我的 exe/lib 膨胀或引发编译/运行时错误。它也适用于 x32 /x64 的..我不知道如何编译和运行得很好..我只是不想链接到那么多..而是链接到一个包含所有四个或两个包含其 unicode 对应项的.如果我编译 x32 程序而不链接 x64,它将无法编译。
  • "我不知道它是如何编译和运行的。" 如果你不知道它是如何工作的,那么你就不知道 它的工作原理。您所知道的就是您已经尝试过,并且没有任何明显损坏。我并不是说 GCC 无法处理它。我是说,根据我的经验,链接到使用 不同 系统 #defines 编译的代码通常会导致错误。
  • 这是一个打字错误。我无法编辑评论,因为它说 cmets 只能在 5 分钟标记之前编辑。我的意思是说:如果我在没有 x32 库的情况下编译 x32,它不会编译。或者,如果我在不使用 x64 库的情况下编译 x64(反之亦然),它将无法编译。没有 Unicode 库的 Unicode 也不会编译。带有 Unicode 库的非 Unicode 将无法编译。所以是的,编译器处理得很好。

标签: c++ object c++11 unix-ar


【解决方案1】:

如果符号名称和目标文件名不同,那么您至少可以在它自己的库中拥有所有 32 位代码和所有 64 位代码。当然,makefile 可以轻松地创建一个名为 xxA.oxxU.o 的目标文件,或者类似 ASCII 与 UNICODE 变体的文件。

如果符号名称相同(例如,它们将用于不带参数且具有相同返回类型的函数,或 extern "C" 函数,因为它们不是基于参数),那么你不能使用这个方法[或者有多个库提供该功能,所以提供一长串库也行不通]。

【讨论】:

  • 我会接受这一点,但先生,我的问题是:如果我有两个文件 - FooA.o 和 FooU.o 并且两个文件都包含一个函数:'void GetString(tString)' 其中 tString 是#ifdef Unicode 字符串。例如:如果定义了 unicode,则 tstring 为 std::wstring,如果未定义 Unicode,则为 std::string。我可以将这两个文件都添加到一个存档中并只提供标题吗?例如:pastebin.com/xyaRLWd6
  • 在 C++ 中,它们会有不同的名称。如果它们是extern "C" 类型的函数,那么您将获得链接器首先找到的任何一个[几乎可以肯定是第一个库中的那个]。但是你可能不能使用tString 作为C 风格函数的参数。如有疑问,请使用nm FooA.o 并将其与nm FooU.o 进行比较以查看名称。
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多