- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些关于链接 C/C++
库的基本问题。我试图了解使用两种不同用法 -L/usr/local/lib -lm
用法和 /usr/local/lib/libm.a
用法的区别.例如,当我编译并链接来自 [SUNDIALS]
library 的示例时, 以下两项工作
gcc -Wall cvRoberts_dns.c -o cvRoberts_dns.exe -I/usr/local/include -L/usr/local/lib/ -lsundials_cvode -lsundials_nvecserial -lm
或
gcc -Wall cvRoberts_dns.c -o cvRoberts_dns.exe /usr/local/lib/libsundials_cvode.a /usr/local/lib/libsundials_nvecserial.a
但是,要编译和链接来自 library 的示例[libsbml]
,下面的作品
g++ -Wall readSBML.cpp -o readSBML.exe -I/usr/local/include -L/usr/local/lib -lsbml
但这不是
g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.a
如果需要,我可以发布我收到的完整错误消息,但消息的最后一行如下
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我的问题如下:
在(第一个示例的)第二种链接方式中,没有关于在哪里可以找到 include
文件(头文件)的信息,编译器如何知道所提供的信息在-I/usr/local/include
第一个例子的第一个样式中提供的是什么?
在第一个示例的第二种样式中,没有 /usr/local/lib/libm.a
(它实际上给出了一条错误消息,即 libm.a
如果我尝试包含它就找不到),那么为什么第一种样式需要 -lm
?
如何以第二种方式编译第二个示例(即使用 /usr/local/lib/libsbml.a
)?我确实看到 /usr/local/lib
文件夹中有文件 - libsbml.a
和 libsbml-static.a
,但没有他们的工作。
如果有帮助,我在 OS X
机器上。
如果有人能在这方面提供帮助,我将不胜感激。
只是一个更新 - 我试过了
g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.5.dylib
并且编译和链接都很好。
谢谢序列号
最佳答案
一般情况
-L
选项用于查找库本身所在的位置。每个库都是一个或多个目标代码(机器语言)文件的集合。无需查找包含文件。-I
选项与链接器无关,它帮助编译器解析驱动程序中使用的头文件(例如Roberts_dns.c)。这发生在预处理阶段。In the second style of linking (of the first example), there is no information regarding where to find the include files (header files),..
如果编译如您所愿,可能是因为 /usr/local/include
位于 gcc
的默认包含路径中。要检查 gcc
的默认包含路径,请执行 gcc -xc -E -v -
。
In the second style of first example there is no /usr/local/lib/libm.a(it actually gives an error message that libm.a cannot be found if I try to include it), then why -lm is required in the first style?
在 Linux 中,某些库如 libc.a
默认直接链接到您的可执行文件,而 libm.a
则不是。但是,在 Mac(您的环境)中,默认情况下 libm 直接链接到可执行文件。所以你不必明确地链接它。 libm.a
不太可能位于/usr/local/lib/
。所以你得到了一个错误。但为什么首先要链接它?
关于c++ - 链接到 c/c++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548336/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!