link 库更好还是将它们带到 test.c 代码所在的本地目录?

Is it better to link libraries or bring them to local directory where test.c code resides?

我很难理解 c 中的链接过程。 (我是 C 的新手)当我在我的本地目录(plplotExample.c 和 mathglExample)中制作 object 测试代码时,有些人抱怨 header 不存在,即使我在 usr/local/....,除了 mathglExample。测试代码如下:

plotExample.c

 #include "plConfig.h"
 #include "plcdemos.h"
 #define NSIZE    101

 int
 main( int argc, char *argv[] )
{
PLFLT x[NSIZE], y[NSIZE];
PLFLT xmin = 0., xmax = 1., ymin = 0., ymax = 100.;
int   i;

// Prepare data to be plotted.
for ( i = 0; i < NSIZE; i++ )
{
    x[i] = (PLFLT) ( i ) / (PLFLT) ( NSIZE - 1 );
    y[i] = ymax * x[i] * x[i];
}

// Parse and process command line arguments
plparseopts( &argc, argv, PL_PARSE_FULL );

// Initialize plplot
plinit();

// Create a labelled box to hold the plot.
plenv( xmin, xmax, ymin, ymax, 0, 0 );
pllab( "x", "y=100 x#u2#d", "Simple PLplot demo of a 2D line plot" );

// Plot the data that was prepared above.
plline( NSIZE, x, y );

// Close PLplot library
plend();

exit( 0 );
 }

错误信息是:

 plplotExample.c:2:10: fatal error: plConfig.h: No such file or directory

mathglExample.c

 #include <mgl2/mgl_cf.h>
 int main()
 {
 HMGL gr = mgl_create_graph(600,400);
 mgl_fplot(gr,"sin(pi*x)","","");
 mgl_write_frame(gr,"test.png","");
 mgl_delete_graph(gr);
 }

错误信息是

 In file included from /usr/include/mgl2/mgl_cf.h:29:0,
             from mathglExample.c:1:
          /usr/include/mgl2/data_cf.h:513:17: error: expected ‘,’ or ‘;’ before ‘mgl_find_roots’

如何修复链接或者我应该将所有代码和库放在一个目录下?我正在使用 linux opensuse leap 15.2 和 Geany 作为 c 编辑器。

  1. plConfig.h 必须与 plotExample.c.
  2. 位于同一目录中
  3. 在文件 /usr/include/mgl2/data_cf.h 的第 513 行第 17 列,编译器需要“,”或“;”在 mgl_find_roots
  4. 之前

如前所述,包含不是链接。在情况 1 中出现文件未找到错误,在情况 2 中出现源代码错误。

  1. 阅读有关如何包含 header 文件的信息:Source file inclusion (or since you're using linux and geany, the compiler is presumably gcc: GNU CPP Header Files)
  2. 尝试阅读并理解编译器消息。

附录(根据您的评论)

-I plplot是相对目录。这意味着,编译器正在您当前的工作目录中搜索名为 plplot 的目录。使用编译器选项 -I /usr/include/plplot 或在源文件中使用以下内容(不使用 -I 编译器选项):

#include <plplot/the_relevant_header_file.h>

据我了解,'pl...' headers 是第三方库(您的项目所依赖的)的一部分,并且已安装,例如由系统或 make,在任何一种情况下,都不要随机选择 headers(来自该项目)并重新定位它们并尝试从该目录中包含它们。因为,headers 本身可能(大概)包含来自该库的其他 headers。在这种情况下,请使用 -I 选项(不推荐)或避免使用编译器选项(推荐)并从系统路径中包含,如我上面的示例中所述。这样做的原因是,从您的 include 指令 (#include ) 中,您可以看到您(不仅是您,而且最重要的是其他人)从哪个库中包含符号。