Я знаю, что есть много вопросов, связанных с общими библиотеками в Linux, но, возможно, из-за того, что я устал от тяжелого дня, пытаясь создать простую динамическую библиотеку в Linux (в Windows это заняло бы менее 10 минут), я не могу найти что происходит в этом случае.
Итак, я пытаюсь создать библиотеку, которая будет связана во время сборки и использоваться во время выполнения (другими словами, не статическая библиотека, не библиотека, которая будет встроена в исполняемый файл). На данный момент он содержит простую функцию. Это мои файлы:
1.
// gugulibrary.cpp
// This is where my function is doing its job
#include "gugulibrary.h"
namespace GuGu {
void SayHello() {
puts("Hello!");
}
}
2.
// gugulibrary.h
// This is where I declare my shared functions
#include <stdio.h>
namespace Gugu {
void SayHello();
}
3.
// guguapp.cpp
// This is the executable using the library
#include "gugulibrary.h"
int main() {
GuGu::SayHello();
return 0;
}
Вот как я пытаюсь построить свой проект (и я думаю, что это не так):
gcc -Wall -s -O2 -fPIC -c gugulibrary.cpp -o gugulibrary.o
ld -shared -o bin/libGugu.so gugulibrary.o
gcc -Wall -s -O2 guguapp.cpp -o bin/GuGu -ldl
export LD_LIBRARY_PATH=bin
Это сохраняется как файл .sh, который я нажимаю и выполняю в терминале. Ошибка, которую я получаю при попытке связать библиотеку:
/tmp/ccG05CQD.o: In function `main':
guguapp.cpp:(.text.startup+0x7): undefined reference to `SayHello'
collect2: ld returned 1 exit status
И это где я потерян. Я хочу, чтобы библиотека сейчас находилась в той же папке, что и исполняемый файл, и, возможно, мне нужен какой-нибудь файл символов / определений или что-то, что я не знаю, как создать.
Спасибо за вашу помощь!
Вы не согласны с вашим GuGu, там также бегают Gugu, это нужно сделать согласованным, тогда это работает (по крайней мере, на моем компьютере некоторые Gugu сейчас)
В вашем C ++ файле GuGu::SayHello
объявлен как символ C ++. В своем заголовке вы помещаете его в extern "C"
блок. Это на самом деле не определено, так как вы не можете использовать синтаксис C ++ (namespace
в этом контексте. Но я предполагаю, что компилятор игнорирует пространство имен и генерирует имя символа C «SayHello». Очевидно, что такая функция никогда не определялась вашей библиотекой. Вынуть extern "C"
биты, потому что ваш API, как определено, не может быть использован из C в любом случае.