1

Linux の共有ライブラリに関連する多くの質問があることは承知していますが、Linux で単純な動的ライブラリを作成するのに苦労して 1 日を過ごすのにうんざりしているためかもしれません (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

そして、これが私が迷っているところです。今のところ、ライブラリを実行可能ファイルと同じフォルダーに配置したいのですが、作成方法がわからないシンボル/定義ファイルなどが必要になるかもしれません。ご協力いただきありがとうございます!

4

2 に答える 2

2

C++ ファイルでGuGu::SayHelloは、C++ シンボルとして宣言されています。extern "C"ヘッダーでは、ブロックでラップしています。namespaceそのコンテキストでC++ 構文 ( ) を使用することは許可されていないため、これは実際には未定義です。しかし、私の推測では、コンパイラは名前空間を無視し、"SayHello" という C シンボル名を生成しています。明らかに、そのような関数はライブラリによって定義されていません。extern "C"とにかく、定義されているAPIはCから使用できないため、ビットを取り出します。

于 2013-01-03T21:40:39.470 に答える
1

あなたはあなたのGuGuと矛盾しています、Guguも走り回っています、これは一貫性を持たせる必要があります、そしてそれは機能します(少なくとも私のコンピューターではGuguのものがいくつかあります)

于 2013-01-03T21:30:16.210 に答える