Я пишу небольшую программу Cpp, и я хотел бы включить функцию, которую я обычно использую в R (функция uniroot). Эта функция R на самом деле является оберткой для функции, написанной на C с именем zeroin, и я хотел бы использовать ее в моем файле Cpp. Проблема в том, что я не делал ничего подобного раньше, поэтому я не уверен, как это сделать или даже с чего начать. Папка для zeroin находится здесь: Zeroin. Думаю, мне нужно каким-то образом включить файл zeroin.c. Я читал здесь, что для использования такой функции мне нужно
Используйте одно из следующих обозначений, чтобы объявить, что объект или функция имеет связь языка language_name:
extern
"language_name" declaration ;
extern "language_name" { declaration ;
declaration ; ... }
Первая запись указывает, что объявление (или определение), которое сразу следует, имеет связь с именем language_name. Вторая запись указывает, что все между фигурными фигурными скобками имеет связь с именем language_name, если не указано иное. Обратите внимание, что вы не используете точку с запятой после закрытия фигурной скобки во второй нотации.
Но я все еще не уверен, какой из них, если мне нужно сделать или как потом перейти к компиляции и связыванию файлов, чтобы получить правильный вывод. Просто компиляция и связывание Cpp в порядке, но я не пробовал Cpp и C раньше.
Чтобы сделать ситуацию более запутанной, загружаемая папка, содержащая zeroin.c, также содержит нагрузку на другие файлы, и я не уверен, что они необходимы или релевантны.
Кто-нибудь знает, что я должен делать с моим файлом cpp?
Просто, чтобы дать больше информации о том, что я хочу делать в Cpp, вычислим корень cdf биномиального распределения вероятности (я еще не нашел, чтобы найти такую функцию для биномиального dist в Cpp еще). Если кто-нибудь знает, что R и Cpp - в RI сделали бы это так:
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, но мне кажется, что это может быть излишним.
Спасибо, Бен.
- EDIT - я попробовал следующий учебник/объяснение и скопировал файл 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 для C и поместить его в тот же каталог.
Включая строку в zeroin.c - #include "math.h"
Предполагая, что у вас есть один c исходный файл zeroin.c и соответствующий файл заголовка zeroin.h, вы должны включить zeroin.h из исходного файла C++ следующим образом:
extern "C" {
#include "zeroin.h"
}
Затем вы можете скомпилировать zeroin.c с вашим C-компилятором, скомпилировать свой C++ код с помощью C++ -компилятора и связать результирующие файлы объектов вместе.