我正在写一个小的Cpp程序,我想要包含一个我通常在R中使用的函数(uniroot函数)。这个R函数实际上是一个用C编写的函数的包装器,名为zeroin,我想在我的Cpp文件中使用它。麻烦的是我之前没有做过这样的事情所以我不确定如何做到这一点甚至从哪里开始。 zeroin的文件夹位于:Zeroin。我想我需要以某种方式包含zeroin.c文件。我已阅读here使用我需要的功能
使用以下符号之一声明对象或 function具有语言language_name的链接:
extern
"language_name" declaration ;
extern "language_name" { declaration ;
declaration ; ... }
第一种表示法表示声明(或定义) 紧接着就有了language_name的链接。第二 符号表示花括号之间的所有内容都有 language_name的链接,除非另有声明。请注意你 在第二个结束大括号后不要使用分号 符号
但是我仍然不确定这些中的哪一个,如果我需要做什么或者如何再编译和链接文件以获得正确的输出。只是编译和链接Cpp很好,但我之前没有尝试过Cpp和C.
为了使问题更加混乱,包含zeroin.c的可下载文件夹也包含其他文件的加载,我不确定它们是否需要或相关。
有人对我的cpp文件应该做些什么建议吗?
只是提供更多关于我想在Cpp中做什么的信息是计算二项式概率分布的cdf的根(我还没有找到Cpp中二项式dist的这样一个函数) )。任何人都知道R和Cpp - 在R中我会这样做:
binomcalc <- function(p, p0, N, B){pbinom(B,N,p)-p0}
soln <- uniroot(binomcalc, c(0,1), p0=0.95, B=10, N=20)
并且soln将包含p的值,其中p0 = 0,即根。
现在我可以使用RInside或类似的东西将R嵌入到我的Cpp程序中,但它可能会让我觉得有点过分。
谢谢, 本。
- 编辑 - 我尝试了以下tutorial/explanation并复制Cfile.c和main.cpp文件,并按照指示执行以下操作:
yrq12edu@env-12bw:~/Desktop/example$ gcc -c -Wall -Werror -fPIC Cfile.c
好的,这是编译的C文件。
yrq12edu@env-12bw:~/Desktop/example$ gcc -shared -o libCfile.so Cfile.o
现在它被编译为共享库。我有文件:
yrq12edu@env-12bw:~/Desktop/example$ ls
Cfile.c Cfile.o libCfile.so main.cpp
但接下来如果我做下一个指令:
$ g++ -L/home/himanshu/practice/ -Wall main.cpp -o main -lCfile
在我的机器上:
yrq12edu@env-12bw:~/Desktop/example$ g++ -L/local/yrq12edu/Desktop/example/ -Wall main.cpp -o main -lCfile
现在只要.so文件在我的LD_LIBRARY_PATH中,这就行了。我想知道有没有办法做静态库或者它必须是一个共享库?我打算用zeroin.c来试试吧。
- 编辑 -
尝试编译zeroin.c会导致错误:
yrq12edu@env-12bw:~/Desktop/example$ gcc -c -Wall -Werror -o zeroin.o zeroin.c
zeroin.c: In function 'zeroin':
zeroin.c:80:17: error: 'EPSILON' undeclared (first use in this function)
zeroin.c:80:17: note: each undeclared identifier is reported only once for each function it appears in
zeroin.c:118:7: error: suggest explicit braces to avoid ambiguous 'else' [-Werror=parentheses]
cc1: all warnings being treated as errors
我认为这是因为math.h没有包含在内,我认为它会像Cpp中的很多常见标题一样,编译器会找到它并包含它 - 也许我需要下载math.h for C和将它放在同一目录中。
zeroin.c中的include行是#include "math.h"
答案 0 :(得分:0)
假设你有一个c源文件zeroin.c和一个相应的头文件zeroin.h,你可以在你的C ++源文件中包含zeroin.h,如下所示:
extern "C" {
#include "zeroin.h"
}
然后,您可以使用C编译器编译zeroin.c,使用C ++编译器编译C ++代码并将生成的目标文件链接在一起。