链接到一个c/C++库

问题描述:

我有一些关于链接到C/C++库的基本问题。我想了解使用两种不同用法-L/usr/local/lib -lm用法和/usr/local/lib/libm.a用法的区别。例如,当我编译,并从[SUNDIALS]library链接一个例子,下面的两个工作链接到一个c/C++库

gcc -Wall cvRoberts_dns.c -o cvRoberts_dns.exe -I/usr/local/include -L/usr/local/lib/ -lsundials_cvode -lsundials_nvecserial -lm 

OR

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) 

我的问题如下:

  1. 在第二种连接方式(第一种示例),没有关于在哪里可以找到include文件(头文件)的信息,编译器如何知道在第一个提供的-I/usr/local/include中提供的信息第一个例子的风格?

  2. 在第一个例子中的第二个样式没有/usr/local/lib/libm.a(它实际上给出了一个错误信息,如果我试图把它列入libm.a无法找到),那么为什么-lm在第一个样式是必需的?

  3. 如何编译第二个样式的第二个示例(即使用/usr/local/lib/libsbml.a)?我确实看到/usr/local/lib文件夹中有文件 - libsbml.alibsbml-static.a,但它们都不起作用。

如果有帮助,我在OS X机器上。

如果任何人在这方面可以提供帮助,我将非常感激。

只是一个更新 - 我试着

g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.5.dylib 

和编译和链接就好了。

感谢 SN

+0

我在Xcode中看到类似错误消息的问题。您可能需要先搜索它。 –

+0

http://*.com/questions/18973042/symbols-not-found-for-architecture-x86-64-on-qtcreator-project –

+0

你想链接到一个静态库或一个dylib? –

一般

  • -L选项是为了寻找到库本身。每个库都是一个或多个目标代码(机器语言)文件的集合。没有必要找到包含文件。
  • -I选项与链接器无关,它有助于编译器解析驱动程序中使用的头文件(例如Roberts_dns.c)。这发生在预处理阶段。

在连接(第一个例子中的)的第二风格,有关于在哪里可以找到包含文件(头文件),没有 信息..

如果编译工作如您所料,这可能是因为/usr/local/include处于gcc的默认包含路径。要检查gcc的默认包含路径,请执行gcc -xc -E -v -

在第一个例子中的第二个样式没有 /usr/local/lib/libm.a(it实际上给出了libm.a如果我试图把它列入) 无法找到一个错误信息,那为什么-lm是 的第一个样式?

在Linux中,像libc.a一些库直接链接到您的execultable默认而libm.a不是。但是,在Mac(您的环境)中,libm默认直接链接到可执行文件。所以你不必明确地链接它。 libm.a位于/usr/local/lib/的可能性较小。所以你有一个错误。但为什么要把它连接起来呢?

+0

谢谢你的解释。我明白'-I'和'-L'标志,但是,我不明白为什么它们不是第二种风格所必需的。我执行了下面的命令 - 'gcc -xc -E -v',将输出粘贴到 - Apple LLVM版本7.3.0(clang-703.0.31) 目标:x86_64-apple-darwin15.5.0 线程模型: posix InstalledDir:/ Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin'。谢谢。 – SN248