【发布时间】:2015-02-01 21:16:50
【问题描述】:
这似乎是一个常见问题,但我无法解决这个问题。
我有一些使用 makefile 编译的 .c 代码。目标是创建一个共享对象 (.so),以便我可以从 R 运行 C 代码。
这是我的生成文件:
obs = R_wrapper.o G.o develop.o utilities.o
CFLAGS = -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG -I/usr/local/include -fPIC -g -O3 -c
LFLAGS = -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -O3 -lgsl -lm -lgslcblas
R_wrapper : $(obs)
$gcc $(LFLAGS) $(obs) -o R_wrapper.so
R_wrapper.o : R_wrapper.c constants.h develop.h G.h
$gcc $(CFLAGS) R_wrapper.c
G.o : G.c G.h constants.h utilities.h develop.h
$gcc $(CFLAGS) G.c develop.c
develop.o : develop.c develop.h G.h constants.h
$gcc $(CFLAGS) develop.c
utilities.o : utilities.c develop.h
$gcc $(CFLAGS) utilities.c
它在我实验室的计算机上运行良好,但在我的个人计算机上却无法运行。导致此问题的原因是我的 R_wrapper.c 开头的这两行。
#include </opt/local/include/gsl/gsl_randist.h>
#include </opt/local/include/gsl/gsl_rng.h>
我试图移动这些文件并给出不同的路径,将文件放在与我的 R_wrapper 文件相同的目录中的 gal_type.h 文件中,我试图重命名我的目录,以便路径更传统,但操作系统没有给我将opt 重命名为usr 的权利(这可能很明显)。我还没有创建makefile,也没有完全得到它。我想我需要在CFLAGS 或LFLAGS 中某处的-I 参数之后修改路径。
编辑 1
我在我的实验室计算机上更改了R_wrapper.c,以摆脱#include <...> 中的整个路径。正如@Beta 预测的那样编译失败。然后,我更改了我的makefile,将-I/opt/local/include/gsl 添加到CFLAGS。我不知道您所说的Verify that the makefile still works. 是什么意思我试图在我的实验室计算机上使用我编辑的makefile 进行编译,但它失败了。然后我重新编辑了我的生成文件,将-I/opt/local/include/gsl 更改为-I/usr/local/include/gsl,因为在我的实验室计算机上,gsl 文件夹位于/usr/local/include/gsl。 -I/opt/local/include/gsl 是我电脑上gsl 文件夹的位置。所以我在你的程序中被困在这里。
编辑 2
我在我的计算机上移动了我的gsl 文件夹,试图从不同的路径中包含。并且发生了一些有趣的事情。例如,当我将gsl 文件夹放入Users/remi/Documents/Biologie/programing/C/ 并写入(CFLAGS)
-I/Users/remi/Documents/Biologie/programing/C/
我收到此错误:
R_wrapper.c:43:10: fatal error: 'gsl_randist.h' file not found
#include <gsl_randist.h> // goal.
当我写信时(CFLAGS)
Users/remi/Documents/Biologie/programing/C/gsl
我收到此错误消息:
"In file included from R_wrapper.c:43: /Users/remi/Documents/Biologie/programing/C/gsl/gsl_randist.h:22:10: fatal error:
'gsl/gsl_rng.h' file not found
#include <gsl/gsl_rng.h>"
【问题讨论】:
-
从编辑 2 中未找到
gsl/gsl_rng.h的消息来看,您应该在源代码中编写#include <gsl/gsl_randist.h>(在标头名称前加上gsl/的路径前缀)。这是一个常见的约定。然后在-I选项中指定包含gsl子目录的目录名称,该子目录包含gsl_*.h标头。你应该阅读文档,如果上面写着#include <gsl/gsl_randist.h>或#include "gsl/gsl_randist.h",那你应该在你的代码中写,因为(因为你已经发现了艰难的方式)如果你不这样做,它就行不通. -
@JonathanLeffler 哦!这解决了我的问题!唷。我在这个问题上挣扎了很多……这实际上很简单(像往常一样)。非常感谢!您能根据您的评论做出回答,以便我检查吗?
-
包含库使用:#include
标签: c compilation compiler-errors makefile