我有一些关于链接C/C++
库的基本问题。我试图了解使用两种不同用法-L/usr/local/lib -lm
用法和/usr/local/lib/libm.a
用法的区别。例如,当我从[SUNDIALS]
库中编译和链接一个示例时,以下两项工作
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
但是,要编译和链接库 中的示例[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
)编译第二个示例?我确实看到有文件 -libsbml.a
并且libsbml-static.a
在/usr/local/lib
文件夹中,但它们都不起作用。
如果有帮助,我在OS X
机器上。
如果有人能在这方面提供帮助,我将不胜感激。
只是一个更新-我试过了
g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.5.dylib
并且编译和链接得很好。
谢谢 SN