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 编辑器。
plConfig.h
必须与 plotExample.c
. 位于同一目录中
- 在文件
/usr/include/mgl2/data_cf.h
的第 513 行第 17 列,编译器需要“,”或“;”在 mgl_find_roots
之前
如前所述,包含不是链接。在情况 1 中出现文件未找到错误,在情况 2 中出现源代码错误。
- 阅读有关如何包含 header 文件的信息:Source file inclusion (or since you're using linux and geany, the compiler is presumably gcc: GNU CPP Header Files)
- 尝试阅读并理解编译器消息。
附录(根据您的评论)
-I plplot
是相对目录。这意味着,编译器正在您当前的工作目录中搜索名为 plplot
的目录。使用编译器选项 -I /usr/include/plplot
或在源文件中使用以下内容(不使用 -I
编译器选项):
#include <plplot/the_relevant_header_file.h>
据我了解,'pl...' headers 是第三方库(您的项目所依赖的)的一部分,并且已安装,例如由系统或 make,在任何一种情况下,都不要随机选择 headers(来自该项目)并重新定位它们并尝试从该目录中包含它们。因为,headers 本身可能(大概)包含来自该库的其他 headers。在这种情况下,请使用 -I 选项(不推荐)或避免使用编译器选项(推荐)并从系统路径中包含,如我上面的示例中所述。这样做的原因是,从您的 include 指令 (#include ) 中,您可以看到您(不仅是您,而且最重要的是其他人)从哪个库中包含符号。
我很难理解 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 编辑器。
plConfig.h
必须与plotExample.c
. 位于同一目录中
- 在文件
/usr/include/mgl2/data_cf.h
的第 513 行第 17 列,编译器需要“,”或“;”在mgl_find_roots
之前
如前所述,包含不是链接。在情况 1 中出现文件未找到错误,在情况 2 中出现源代码错误。
- 阅读有关如何包含 header 文件的信息:Source file inclusion (or since you're using linux and geany, the compiler is presumably gcc: GNU CPP Header Files)
- 尝试阅读并理解编译器消息。
附录(根据您的评论)
-I plplot
是相对目录。这意味着,编译器正在您当前的工作目录中搜索名为 plplot
的目录。使用编译器选项 -I /usr/include/plplot
或在源文件中使用以下内容(不使用 -I
编译器选项):
#include <plplot/the_relevant_header_file.h>
据我了解,'pl...' headers 是第三方库(您的项目所依赖的)的一部分,并且已安装,例如由系统或 make,在任何一种情况下,都不要随机选择 headers(来自该项目)并重新定位它们并尝试从该目录中包含它们。因为,headers 本身可能(大概)包含来自该库的其他 headers。在这种情况下,请使用 -I 选项(不推荐)或避免使用编译器选项(推荐)并从系统路径中包含,如我上面的示例中所述。这样做的原因是,从您的 include 指令 (#include