【问题标题】:Using zeroin.c in a cpp program在 cpp 程序中使用 zeroin.c
【发布时间】: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"

【问题讨论】:

    标签: c++ c r


    【解决方案1】:

    假设您有一个 c 源文件 zeroin.c 和一个相应的头文件 zeroin.h,您将在 C++ 源文件中包含 zeroin.h,如下所示:

    extern "C" {
    #include "zeroin.h"
    }
    

    然后您可以使用您的 C 编译器编译 zeroin.c,使用您的 C++ 编译器编译您的 C++ 代码并将生成的目标文件链接在一起。

    【讨论】:

    • 我只有一个 zeroin.c 文件(它需要 math.h)和其他一些看起来只是数据文件和验证 zeroin 算法的例程的文件。
    • 我对此有所了解 - 请参阅我的编辑,但现在我想完成此操作以生成独立的二进制文件,而不是需要共享库。
    • 要生成一个独立的二进制文件,只需使用 gcc -c -Wall -Werror -o cfile.o cfile.c,然后使用 g++ -L/home/himanshu/practice/ -Wall main.cpp cfile。 o -o 主要
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2011-08-07
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多