4

xdotool が要件を満たすことができるかどうかをテストするための簡単なプログラムを作成しました。(そうではありません。私の最初のステップは、xdotool ライブラリを呼び出せるかどうかを確認することです。)

#include <xdo.h>
#include <iostream>

using namespace std;

int main(){
    cout << xdo_version() << endl;
    xdo_new(NULL);
    return 0;
}

ただし、これを でコンパイルするとg++ -o a main.cpp libxdo.a -lXtst -lX11 -lXinerama -I ../test/xdotool-2.20110530.1、次のエラー メッセージが表示されます。

/tmp/ccW95RQx.o: In function `main':
main.cpp:(.text+0x5): undefined reference to `xdo_version()'
main.cpp:(.text+0x29): undefined reference to `xdo_new(char*)'
collect2: error: ld returned 1 exit status
make: *** [sendkey] Error 1

動的ライブラリをインストールするため、apt-get install の開発パッケージは使用しませんでした。そこで、apt-get source を実行してライブラリを自分でビルドしました。次のコマンドを実行して、xdo_version と xdo_new が静的ライブラリで定義されている関数であることを確認しました。

$ nm libxdo.a | grep xdo_version
00000000000002b0 T xdo_version
$ nm libxdo.a | grep xdo_new
0000000000004070 T xdo_new
0000000000003c90 T xdo_new_with_opened_display

私が間違っていなければT、シンボルの名前のほかに、関数が定義されていることを意味します。

結論として、上記の C++ スニペットを正常にコンパイルし、xdotool に対して静的にリンクしようとしていますが、上記のエラーが発生しました。

4

2 に答える 2

5

ヒント: リンカが関数のシグネチャを表示する場合、リンカはその関数のシグネチャを認識しています。これは何を意味するのでしょうか?これは、コンパイル時に何らかの形で関数名にエンコードされていることを意味します。つまり、C++名マングリングの被害者です。

xdo.hC コードが C++ としてコンパイルされた場合のセーフガードがヘッダーに含まれていないようです。extern "C"関数を自分で手動で宣言してから、再コンパイルすると機能します。

于 2013-05-22T16:10:49.700 に答える
0

コーディングから実行まで、g++ で動的ライブラリを使用する際のガイダンスを次に示します。

アプリケーション コードmain.cpp

#include <iostream>

using namespace std;

extern "C" int funct(const int in);

int main(int argc, char** args){

    cout << "test message " << funct(5) << endl;
    return 0;
}

関数コードlibtest.cpp

#include <iostream>

using namespace std;

extern "C" int funct(const int in){
    return in*in;
}

.so ファイル のビルド libtest.so

g++ -fPIC -c libtest.cpp
g++ -shared -o libtest.so libtest.o

アプリケーションメインの構築

g++ -L. main.cpp -o main -ltest

実行中のアプリケーション が環境変数を設定

@bash: LD_LIBRARY_PATH=:$LD_LIBRARY_PATH をエクスポートします

@tcsh: setenv LD_LIBRARY_PATH :$LD_LIBRARY_PATH

それを実行します!!!

./main
test message 25
于 2014-07-08T07:26:40.990 に答える