2016-01-25 3 views
2

Я рассмотрел все решения на stackoverflow, а также спрошу ubuntu.Как запустить c-программу с .so-файлом

У меня есть программа идти

package main 

import "C" 

//export Getint 
func Getint() int { 
     return 2 
} 

func main() {} 

и я сформировали .so файл для того же с именем t.so и заголовочный файл й

Теперь я хотел бы использовать эту функцию в моей C программа. Я написал код, но я не знаю, как его выполнить.

#include <stdio.h> 
#include <t.h> 
int main() 
{ 
int a; 
a=Getint(); 
printf("number : %d",a); 
return 0; 
} 

, когда я исполню ее с

gcc c.c t.so 

он генерирует a.out файлу

но в момент запуска a.out с ./a.out дает ошибку

./a.out 
Error while loading shared libraries: t.so: can not open shared object file: no such file or directory exists. 

затем я пробовал с

gcc -c c.c -l t.so 

поэтому он генерирует файл c.o и не является исполняемым.

+0

все эти файлы находятся в одном месте – NIket

ответ

3

Возможно, ваш погрузчик не может найти библиотеку. Попробуйте поместить путь в каталог, где libarry находится в LD_LIBRARY_PATH перед запуском вашего двоичного файла.

export LD_LIBRARY_PATH=/path/to/my/library 
./a.out 
2

Вы должны использовать LD_LIBRARY_PATH, чтобы динамический компоновщик найти свою общую библиотеку в списке. Синтаксис похож на PATH список каталогов, разделенных :.

В OSX эта переменная среды называется DYLD_LIBRARY_PATH.

7

Вы должны использовать linker option-rpath, который сообщает компоновщику, чтобы добавить информацию в исполняемую программу, где можно найти библиотеки времени выполнения, такие как ваш файл .so.

Это можно сделать с помощью опции -Wl GCC, который инструктирует программу GCC внешнего интерфейса, чтобы передать опцию компоновщика:

$ gcc c.c t.so -Wl,-rpath=$(pwd) 

Это будет проходить -rpath=$(pwd) линкера и $(pwd) заставляет оболочку для вызова pwd, чтобы вернуть текущий каталог.

Пока вы не перемещаете библиотеку, программа должна работать.


Вы можете использовать переменные окружения LD_LIBRARY_PATH тоже, но это not recommended.

2

.so файлы являются общими объектами, то есть объектом, доступным для всех приложений, которые в них нуждаются, то есть совместно. Благодаря этим характеристикам их необходимо хранить в хорошо известном месте. Кроме того, они должны быть проиндексированы динамическим компоновщиком.

В Linux, например, вы, как правило, есть файл /etc/ld.so.conf где все каталоги, где общие объекты автоматически считываются из сохраняются

Так что ваши варианты:

  • Поместите общий файл объекта в известное место
  • Поместите свой файл общих объектов в выбранное место и дайте динамическому компоновщику узнать об этом: в linux вы можете изменить ld.so.conf и запустите ldconfig для обновления индексов ld
  • Как и другие, напишите путь вашего .so в переменной env LD_LIBRARY_PATH (поскольку динамический компоновщик читает его перед запуском приложения). Это необходимо сделать при создании каждой среды
  • Как и другие предполагаемые варианты использования -rpath при компиляции. Обратите внимание, что в этом случае вы не можете переместить файл .so после компиляции

Лично я предпочитаю устанавливающего .so файл в путь к библиотеке системы