Xcode:添加链接器标志和“链接二进制文件库”的区别

4
我几天前从Windows转换到了Mac,并发现在Xcode中链接过程有点困惑。我有一个名为nag C库的静态库,其文件名为“libnagc_nag.a”。如果我将“/opt/NAG/clmi623dgl/lib/libnagc_nag.a”添加到“其他链接器标志”,程序运行得非常完美。另一方面,如果我进入“Build Phases -> 链接二进制文件与库 -> + -> 添加其他”,然后添加“libnagc_nag.a”,库文件将会出现在项目导航器中,但是在构建成功并尝试运行时,我会得到以下错误信息。
dyld: Library not loaded: 
/fserver/mo/cl23/CL23.3/CLMI623DG_build/BUILD_mac_64/climp/LIBS/nag_lm/libnagc_nag.dylib
Referenced from: /Users/german/Library/Developer/Xcode/DerivedData/myproj-bjepqyzlzkayspddtaspmmzxgaid/Build/Products/Debug/myproj
Reason: image not found

我的问题如下:

为什么会有所不同? 它是否认为自己是一个动态库? 在第二种情况下,我该如何解决这个问题?

2个回答

4

编辑:我已经删除了一个过时文章的链接。

问题在于链接标识符对于动态库和静态库是相同的,且文件扩展名被去除。因此,如果您有一个名称相同但仅扩展名不同的静态库和动态库,链接器将默认选择动态库版本。即使您在“链接二进制文件库”菜单中选择了静态版本,也会出现这种情况。然后,如果应用程序找不到动态库,将会出现错误。因此,对于这个问题的答案是:

1)如果没有同名的动态库,则不会有任何影响。

2)链接器只知道库的名称,因此默认选择动态版本。

3)解决方案可以是重命名库或使用第一种方法。


1
链接已损坏。 - Will Gwo

0

你的项目是否有多个构建目标?如果有,你是否将库添加到了适当的目标中?可以再次查看“链接二进制文件与库”或通过在“项目导航器”中选择框架并在“文件检查器”窗格中查看“目标成员资格”来进行检查。

此外,你的框架搜索路径设置正确吗?点击项目导航器顶部的项目,然后在屏幕顶部中央点击“构建设置”,然后到“搜索路径”下,确保包含适当的路径。


不,它只有一个目标。这只是默认的C++项目,我将main中的文本更改为NAG提供的示例中的文本。 库已正确添加,或者至少在“目标成员资格”中是我所看到的。此外,框架搜索路径和lib路径都是指向“libnagc_nag.a”文件的路径。 - German Capuano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接