相关疑难解决方法(0)

86
推荐指数
8
解决办法
4万
查看次数

将两个共享库与一些相同的符号链接在一起

我链接两个不同的共享库.两个库都定义了一些共享名称但具有不同实现的符号.我不能让每个库使用自己的实现而不是另一个.

例如,两个库都定义了一个bar()内部调用的全局函数.库1调用它foo1(),库2调用它foo2().

Lib1.so:

T bar
T foo1()     // calls bar()
Run Code Online (Sandbox Code Playgroud)

Lib2.so:

T bar
T foo2()     // calls bar()
Run Code Online (Sandbox Code Playgroud)

如果我将我的应用程序链接到Lib1.so然后链接到Lib2.so即使在调用时也会调用Lib1.so中的bar实现foo2().另一方面,如果我将我的应用程序链接到Lib2.so然后链接到Lib1.so,则始终从Lib2.so调用bar.

有没有办法让库总是更喜欢自己的实现高于任何其他库?

c unix gcc shared-libraries dynamic-linking

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

如何让gcc为所有符号名称添加前缀

我知道在过去有一个选项-fprefix-function-name会为所有生成的符号添加前缀,它似乎不再是gcc的一部分.有没有其他方法可以做到这一点?

c c++ gcc g++ pre-compilation

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

Windows的objcopy等价物?(用于冲突lib符号的Hack)

我正在寻找相当于GNU工具objcopy的Windows .我正在寻找在这里发布我的问题的建议,但我需要跨平台(Windows,Linux和Mac).我在谷歌朋友找不到答案,所以解决方案可能需要以不同方式实施.谢谢!

c++ symbols libs collision

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

如何在其中包含与 OBJECT 文件具有相同名称的静态库?

我正在开发一个 iPad 应用程序,其中包含 2 个第三方静态库。这两个库中目标文件的名称相同。在构建我得到的应用程序时

“Apple Mach -O (id) 错误”

因为这两个库中目标文件的名称相同。如何解决这个问题呢?

错误看起来像:

ld: duplicate symbol _T_strcpy in /Users/indiait-supportservices/Desktop/untitled folder/Universal/lib/simulator/libSecurIDLib.a(mem.o) and /Users/indiait-supportservices/Library/Developer/Xcode/DerivedData/ReceiverForiOS-aqpprpcivvjjadbsutqqmtjsoczk/Build/Intermediates/ReceiverForiOS.build/Debug-iphonesimulator/myApp iPad.build/Objects-normal/i386/pdcrypte2.o for architecture i386

collect2: ld returned 1 exit status

Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2 

failed with exit code 1.
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ipad xcode4

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

链接多个静态库时出现重复的符号错误.

已经有相当多的相关问题,但我只是没有解决这个问题.我正在构建一个包含两个独立静态库的应用程序:RestKit和另一个在NDA上的静态库.当我构建时,我得到Apple Mach-O链接器错误如下:

duplicate symbol _NewBase64Decode 
in /Users/geraldwburke/Desktop/iOS Programming/MyApp/someLib.a(NSData+Base64.o) 
and /Users/geraldwburke/Library/Developer/Xcode/DerivedData/MyAppddlwzdeskfwaxyargomvfhurvxzi/Build/Products/Debug-iphoneos/libRestKit.a(NSData+Base64.o) 
for architecture armv7
Run Code Online (Sandbox Code Playgroud)

现在,我已经看到了一些潜在的解决方案.这篇文章似乎很有希望 我还尝试使用此博客条目中的脚本添加构建规则.我已经尝试添加和删除-ObjC,-all_load和-force_load链接器标志.无论我尝试过什么,我仍然会得到同样的错误.有谁知道如何解决这个问题?

顺便说一句,我会删除我的同一篇文章.把它贴在错误的帐户上.

xcode linker static-libraries duplicate-symbol ios

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

重写静态 iOS 库中的符号

我正在开发一个链接多个静态库的 iOS 应用程序。挑战在于,这些链接库定义了具有不同实现的相同方法名称。奇怪的是,我没有收到任何duplicate symbol definition错误;但是,毫不奇怪,我最终只能访问该方法的一种实现。

更清楚地说,假设我有 libA 和 libB,它们都定义了一个名为 func1() 的全局 C 方法

当我链接 libA 和 libB 并调用 func1() 时,它会解析为 libA 或 libB 的实现,而没有任何编译警告。但是,我需要能够分别访问 libA 的 func1() 和 libB 的 func1()。

有一个类似的 SO post解释了如何在 C 中完成它(通过符号重命名)但不幸的是,正如我发现的那样,该objcopy工具不适用于 ARM 架构(因此是 iPhone)。

(我会把它提交到 App Store,因此,动态链接不是一个选项)

xcode static-linking ios

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

C 代码中自动为函数名称添加前缀

假设我将我的应用程序与两个静态库链接。在这两个库中,我们可以找到名称相同但功能不同的函数,这会导致符号冲突。我通常的方法 - 编辑库的源代码并为每个函数的名称添加唯一的前缀。但我不想再手动执行此操作了。是否有某种工具或智能方法可以为选定源文件中的所有函数添加自定义前缀?我使用 Visual Studio 2010 在 Linux 和 Windows 上工作,因此我可以在这两个平台中的任何一个上使用此类工具。

c prefix

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

在构建时更改子例程名称以避免Xcode中的冲突

背景

我建立一个iOS应用程序(这我就打电话MyApp从这里开始),这将依赖于由几个独立的静态库进行计算(我称之为Lib1,Lib2,Lib3,...).每个库建在它自己的项目,然后导入到一个工作区(这样的工作区将包含MyApp,Lib1,Lib2,...).有关如何设置此处的更多详细信息.这些库由其他独立的产品使用MyApp,因此我希望尽量减少库中的任何更改.这些库也是用(plain)编写的C,因此没有头文件.

某些功能名称由多个存储库中使用(因此两者Lib1Lib2可能各自具有DoStuff方法).具有相同名称的功能大致做同样的事情,但对于如何是做到这一点,可以是磁带库之间不同的一些具体的,所以在实际的代码DoStuffLib1可能比代码完全不同DoStuffLib2.编写一个DoStuff在每个库中完全相同的通用将是非常困难的.

问题

当应用程序正在运行时,它没有DoStuff从正确的库中调用正确的.我发现了这一点,因为在调试会话期间调用了错误的函数(由于DoStuff函数的细微差别,最终导致应用程序崩溃).

我在寻找什么

每个库只有一个入口点MyApp,每个入口点都有唯一的名称.如果DoStuff从入口点方法Lib1(或任何其他方法Lib1)调用,那么我希望它调用该DoStuff方法Lib1.实现这一目标的最佳方法是什么?

有没有办法(可能通过XCode中的某个设置)我可以这样做,以便每个库都是它自己的命名空间?这将是我解决问题的首选方法.我想我可以通过并重命名重复的函数,以便它们都是唯一的(因此DoStuff方法Lib1可以重命名为Lib1DoStuff或类似的东西),但有数百个函数可能有重复的名称,我们将是将数百个库添加到项目中,因此必须手动重命名所有函数并修复对它们的所有调用将花费大量时间,而我的老板并不认为这是一个可行的选择.


UPDATE

在查看了Josh Caswell的评论以及他提供的一些链接后,看起来可能会在编译库时自动重命名所有函数,这将是尝试修复THE ISSUE上述内容的最佳方法.从我所看到的,objcopy在评论中的几个链接中提到的内容不支持iOS.我终于碰上了这个博客条目,其中谈到创建自定义生成Xcode的目标规则,这个博客,谈到了自定义生成设置和构建阶段.

我是否正确地假设我可以在构建过程中的某个时刻使用脚本自动附加到我的每个库中的所有函数的名称,而不是像我在上一WHAT …

xcode objective-c static-libraries collision ios

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

静态库具有相同的函数名称,导致重复符号错误

我在我的iPad应用程序中使用了2个第三方库.我不知道这些库的源代码.这些库在两者中都具有相同名称的函数.因为功能名称中的冲突,我得到"Apple Mach - O(id)错误".我无法更改其中的函数名称,因为源代码未知.在构建应用程序时,错误正在发生.

该错误表明:

ld:/ Users/Desktop/untitled文件夹/ Universal/lib/simulator/myLib.a(mem.o)和/ Users/Library/Developer/Xcode/DerivedData/iOS-aqpprpcivvjjadbsutqqmtjsoczk/Build/Intermediates/ios中的重复符号_T_strcpy. build/Debug-iphonesimulator/myApp iPad.build/Objects-normal/i386/pdcrypte2.o for architecture i386 collect2:ld返回1退出状态命令/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++- 4.2退出代码1失败

谁能分享一些建议?

iphone objective-c ipad xcode4

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

链接器如何解析动态可加载库中的重复符号?

我有两个可动态加载的库lib_smtp.so和libpop.so等.它们都有一个名为的全局变量protocol,它分别被初始化为"SMTP"和"POP".我有另一个静态库libhttp.a,其中protocol初始化为"HTTP".

现在由于某种原因,我需要静态编译所有动态可链接和可加载库并包含在可执行文件中.这样做我在链接静态库时遇到错误" 符号的多重定义 ".

我很想知道链接器在动态链接期间如何解析重复的符号,其中所有三个提到的库都被链接了?

有没有什么方法可以静态地做链接器在动态链接中做的那样,即没有任何冲突将所有静态库添加到具有相同符号的可执行文件?如果没有,为什么静态链接库的过程不同.

c linux linker build dynamic-linking

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