Связать динамическую разделяемую библиотеку в Linux — неопределенная ссылка на функцию

Я знаю, что есть много вопросов, связанных с общими библиотеками в 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

И это где я потерян. Я хочу, чтобы библиотека сейчас находилась в той же папке, что и исполняемый файл, и, возможно, мне нужен какой-нибудь файл символов / определений или что-то, что я не знаю, как создать.
Спасибо за вашу помощь!

1

Решение

Вы не согласны с вашим GuGu, там также бегают Gugu, это нужно сделать согласованным, тогда это работает (по крайней мере, на моем компьютере некоторые Gugu сейчас)

1

Другие решения

В вашем C ++ файле GuGu::SayHello объявлен как символ C ++. В своем заголовке вы помещаете его в extern "C" блок. Это на самом деле не определено, так как вы не можете использовать синтаксис C ++ (namespaceв этом контексте. Но я предполагаю, что компилятор игнорирует пространство имен и генерирует имя символа C «SayHello». Очевидно, что такая функция никогда не определялась вашей библиотекой. Вынуть extern "C" биты, потому что ваш API, как определено, не может быть использован из C в любом случае.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector