Использование zeroin.c в программе cpp

0

Я пишу небольшую программу 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"

Теги:

1 ответ

0

Предполагая, что у вас есть один c исходный файл zeroin.c и соответствующий файл заголовка zeroin.h, вы должны включить zeroin.h из исходного файла C++ следующим образом:

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

Затем вы можете скомпилировать zeroin.c с вашим C-компилятором, скомпилировать свой C++ код с помощью C++ -компилятора и связать результирующие файлы объектов вместе.

  • 0
    у меня есть только файл zeroin.c (ему нужен math.h) и некоторые другие файлы, которые кажутся просто файлами данных и процедурой для проверки алгоритма zeroin.
  • 0
    Я узнал немного больше об этом - посмотрите мое редактирование, но теперь я хотел бы сделать это, чтобы создать отдельный двоичный файл, а не использовать общую библиотеку.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню