2013-11-14 2 views
0

Я создаю общий объект (.so) файл, построенный из C, который будет использоваться из R. У меня возникают проблемы с компоновкой/компиляцией объекта со всем исходным кодом коды, тестовые коды и файлы заголовков.Компиляция для глобальных переменных в нескольких файлах в C для создания общей библиотеки

Этот файл .so будет загружен с использованием dyn.load() в R и соответствующих функций.

Это структура файлов:

C_header_file1.h // some support functions 
C_src_file1.h // some source code for support functions 
C_header_file2.h // some other support functions 
C_src_file2.h // some source code for support functions 
C_header_testfunctions.h // testing functions that are called from R for testing 
C_src_testfunctions.c // source code for test functions 
C_file_with_main_calling_functions.c // main src file which takes functions from header files (not test header file) to do stuff 
C_file_with_main_extern_vars.h // has extern global variables 

Файл C_file_with_main_calling_functions.c имеет набор глобальных переменных (Специфические генератор случайных чисел), которые могут быть доступны с помощью C_file_with_main_calling_functions.c (когда основные функции вызываются пользователем от R) и C_src_testfunctions.c (когда функции тестирования вызывают на этапе тестирования пользователь из R).

C_file_with_main_extern_vars.h выглядит следующим образом:

// random number generation set up 
extern const gsl_rng *gBaseRand;  // global rand number generator 
extern unsigned long randSeed; 
extern const double lowest_double = -GSL_DBL_MAX; 
extern const double highest_double = GSL_DBL_MAX; 
extern FILE *fp = NULL; 

Оба C_file_with_main_calling_functions.c и C_src_testfunctions.c имеет #include "C_file_with_main_extern_vars.h".

Как создать общий объект? Это дает мне следующее сообщение об ошибке:

R CMD SHLIB C_file_with_main_calling_functions.c ./../test/C_src_testfunctions.c ./../src/src_file1.c ./../src/src_file2.c ./../src/src_file3.c ./../src/src_file6.c ./../src/src_file5.c -lgsl -lgslcblas 
gcc -std=gnu99 -I/usr/local/R.framework/Resources/include -DNDEBUG -I/sw/include -I/usr/local/include -fPIC -g -O2 -c C_file_with_main_calling_functions.c -o C_file_with_main_calling_functions.o 
In file included from C_file_with_main_calling_functions.c:35: 
/mydir/C/include/C_file_with_main_calling_functions.h:15: warning: 'lowest_double' initialized and declared 'extern' 
/mydir/C/include/C_file_with_main_calling_functions.h:16: warning: 'highest_double' initialized and declared 'extern' 
/mydir/C/include/C_file_with_main_calling_functions.h:17: warning: 'fp' initialized and declared 'extern' 
C_file_with_main_calling_functions.c: In function 'func2': 
C_file_with_main_calling_functions.c:54: warning: implicit declaration of function 'func1' 
C_file_with_main_calling_functions.c: At top level: 
C_file_with_main_calling_functions.c:61: warning: conflicting types for 'func1' 
C_file_with_main_calling_functions.c:54: warning: previous implicit declaration of 'func1' was here 
C_file_with_main_calling_functions.c: In function 'C_file_with_main_calling_functionsC': 
C_file_with_main_calling_functions.c:207: warning: passing argument 1 of 'func2' from incompatible pointer type 
C_file_with_main_calling_functions.c:271: warning: passing argument 1 of 'gsl_rng_free' discards qualifiers from pointer target type 
gcc -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/sw/lib -L/usr/local/lib -o C_file_with_main_calling_functions.so C_file_with_main_calling_functions.o ./../test/C_src_testfunctions.o ./../src/src_file1.o ./../src/src_file2.o ./../src/src_file3.o ./../src/src_file6.o ./../src/src_file5.o -lgsl -lgslcblas -F/usr/local/R.framework/.. -framework R -lintl -Wl,-framework -Wl,CoreFoundation 
duplicate symbol _fp in: 
    C_file_with_main_calling_functions.o 
    ./../test/C_src_testfunctions.o 
duplicate symbol _lowest_double in: 
    C_file_with_main_calling_functions.o 
    ./../test/C_src_testfunctions.o 
duplicate symbol _highest_double in: 
    C_file_with_main_calling_functions.o 
    ./../test/C_src_testfunctions.o 
ld: 3 duplicate symbols for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [C_file_with_main_calling_functions.so] Error 1 

Я также не хочу два отдельных общих объектов (один для тестирования и один для использования пользователя) (это я пробовал и работу).

ответ

0

На языке C инициализация - это определение.

Давайте рассмотрим простой пример: decl.h файл содержит одно объявление

#ifdef CORR 
extern int i; 
#else 
extern int i = 5; 
#endif 

decl.c файл содержит определение:

#include "decl.h" 
int i = 5; 
int foo() { return i; } 

компилировать с gcc -DCORR decl.c -c, и вы не увидите никаких проблем, но если вы будете пытаться скомпилировать с инициализацией в объявлении extern, вы получите множественную ошибку определения.

Так что ваш файл заголовка должен содержать только объявления, и может выглядеть следующим образом:

extern const gsl_rng *gBaseRand; 
extern unsigned long randSeed; 
extern const double lowest_double; 
extern const double highest_double; 
extern FILE *fp; 

А внутри любого файла C, скажем C_file_with_main_calling_functions.c, вы можете положить несколько определений:

const gsl_rng *gBaseRand;  // global rand number generator 
unsigned long randSeed; 
const double lowest_double = -GSL_DBL_MAX; 
const double highest_double = GSL_DBL_MAX; 
FILE *fp = NULL; 

Тогда все должны компилироваться и связываться без ошибок.

+0

Спасибо @konstantin. Я обновил свои тестовые коды выше, но он все еще не работает. Любая помощь будет оценена. – user1971988

+0

Мой ответ был связан с первоначальным вопросом о компиляции кода C. Теперь вы полностью изменили вопрос, и мой ответ не более уместен. Вы должны ставить старый вопрос и задавать новый вопрос, чтобы все, кто испытал ваши проблемы с компиляцией, могли найти его и решить. –

+0

Я вернул старый вопрос и принял ваш ответ. Я отправлю новый вопрос. – user1971988

Смежные вопросы