我不可能是唯一一个遇到这种情况的人。
我有一个 C++ 应用程序需要与一个第三方和 SDK 中设置的另一个静态库链接。SDK 出于某种令人沮丧的原因,将同一个第三方库的一个子集重新编译到他们自己的(重命名的)库中,尽管符号本身的名称相同,并且它们没有封装在命名空间中。我的应用程序本身依赖于相同的第三方库。
我已经考虑了一些选择,但也许我遗漏了一些东西,希望新的外观能帮助我。也许我很接近,有人会知道其中一个的下一步。我将列举到目前为止我尝试过的方法以及每个解决方案的缺点:
与两者联系。我收到大约 2500 行符号重新定义/大小更改警告和错误。这是我第一次发现它们定义了相同的符号。我正在尝试使用 g++ 重新编译 OpenSSL 并将其放入命名空间中...请参阅下面的编辑...
仅与 SDK 链接。我得到了我自己的代码所依赖的未定义符号 - 这是我发现他们对第三方库的重新编译是一个子集,或者至少配置为禁用了一个模块。
仅与第三方库链接。我有几个由 SDK 报告的未定义符号 - 其中一个实际上是第三方库中头文件中的#define,因此第三方库中的所有引用都解析为定义,但外部引用没有。我把它移到了 c 文件中,它解决了这个问题,但是我仍然有两个我在任何地方都找不到的未解决的函数。这是迄今为止我得到的最接近的。
从一个库中删除冲突的符号并在两者中进行链接。到目前为止,这还没有奏效。这可能是 SDK 中静态链接的 lib 与我尝试使用的第三方 lib 的版本之间的版本问题,但看起来某些函数在符号之间移动,因此通过删除符号,我无意中删除了我在其他地方需要的功能。SDK 中符号中的函数与第三方库中符号中的函数之间似乎没有完美的映射。在无需手动调整地址的情况下剥离功能是否合理?
我一直在检查库中的符号:
nm -C --defined-only lib<name>.a
并使用以下方法提取整个对象:
ar -x lib<name>.a <objname>.o
希望这也能帮助那些不得不与相互冲突的第三方库链接的其他人。具体而言,第三方库是OpenSSL,SDK 是Opsec - libcpopenssl.a 是 Opsec 中的违规库。
**编辑 - 一个较晚的可能解决方法可能是使用 g++ 重新编译 OpenSSL 并将整个内容放在命名空间中,然后链接两个库。我现在正在尝试...更多...