链接到c / c ++库

时间:2016-07-24 03:01:44

标签: c++ sundials

我有一些关于链接到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

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文件(头文件)的信息,编译器如何知道{{1}中提供的信息1}}在第一个例子的第一个样式中提供了吗?

  2. 在第一个示例的第二个样式中没有-I/usr/local/include(它实际上给出了一条错误消息,如果我尝试包含它,则无法找到/usr/local/lib/libm.a),那么为什么{{1第一种风格需要?

  3. 如何在第二种样式中编译第二个示例(即使用libm.a)?我确实看到-lm文件夹中有文件/usr/local/lib/libsbml.alibsbml.a,但都没有。

  4. 如果有帮助,我就在libsbml-static.a机器上。

    如果有人能在这方面提供帮助,我将非常感激。

    只是更新 - 我试过

    /usr/local/lib

    并且编译和链接就好了。

    由于 SN

1 个答案:

答案 0 :(得分:1)

一般

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

在第二种链接方式(第一个例子)中,没有   有关在何处查找包含文件(头文件)的信息,..

如果编译按预期工作,可能是因为/usr/local/include位于gcc的默认包含路径中。要检查gcc执行gcc -xc -E -v -

的默认包含路径
  

在第一个例子的第二种风格中没有   /usr/local/lib/libm.a(实际上给出了一个错误消息,即libm.a   如果我试图包括它,就找不到了,那么为什么需要-lm   第一种风格?

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