【发布时间】:2014-02-06 06:06:49
【问题描述】:
我正在编写一个小型 Cpp 程序,我想包含一个我通常在 R 中使用的函数(uniroot 函数)。这个 R 函数实际上是一个用 C 语言编写的名为 zeroin 的函数的包装器,我想在我的 Cpp 文件中使用它。麻烦的是我以前没有做过这样的事情,所以我不确定如何做,甚至不确定从哪里开始。 zeroin 的文件夹在这里:Zeroin。我想我需要以某种方式包含 zeroin.c 文件。我读过here 说要使用这样的功能,我需要
使用下列符号之一来声明一个对象或 函数有语言language_name的链接:
extern
"language_name" declaration ;
extern "language_name" { declaration ;
declaration ; ... }
第一个符号表示声明(或定义) 紧随其后的是语言名称的链接。第二 符号表示大括号之间的所有内容都有 language_name 的链接,除非另有声明。请注意,您 不要在第二个结束大括号后使用分号 符号。
但我仍然不确定其中哪些是我需要做的,或者如何去编译和链接文件以获得正确的输出。只需编译和链接 Cpp 就可以了,但我之前没有尝试过 Cpp 和 C。
为了让事情更加混乱,包含 zeroin.c 的可下载文件夹还包含大量其他文件,我不确定它们是否需要或相关。
有人对我应该如何处理我的 cpp 文件有任何建议吗?
只是为了提供有关我想要在 Cpp 中做的更多信息是计算二项式概率分布的 c.d.f 的根(我还没有找到在 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 将包含 p0 = 0 时的 p 值,即根。
现在我可以使用 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 中的许多常见头文件一样,编译器会在其中找到并包含它 - 也许我需要为 C 下载 math.h 和放在同一个目录下。
zeroin.c 中的包含行是#include "math.h"
【问题讨论】: