2

Suse 11 x86マシンでACE6.0.2を使用しています。gccのバージョンは4.3で、ACE-TAOlibは問題なくコンパイルされています。

私がやりたかったテストは非常に単純ですが、合格することはできません。

私は3つのファイルを持っています。a1.hはクラスAを定義します。

class A 
{ 
    public: 
        A(); 
        void print(); 
};

a1.cppには、ACElibからメソッドを呼び出す関数があります。

#include "a1.h" 
#include <ace/Thread.h> 
#include <iostream> 

A::A(){} 

void A::print() 
{ 
    long t=ACE_Thread::self(); 
    std::cout<<t<<std::endl; 
} 

main.cppはクラスAからprint()を呼び出します

#include "a1.h" 

int main() 
{ 
    A a; 
    a.print(); 
    return 0; 
} 

私が使用したコンパイルコマンドは次のとおりです。

1.ACE_threadを使用してa1.oを生成します

g ++ -c -fPIC -fno-strict-aliasing -fvisibility = hidden -fvisibility-inlines-hidden -O3 -ggdb -pthread -Wall -W -Wpointer-arith -pipe -D_GNU_SOURCE -I / opt / ACE_wrappers -DACE_HAS_VALGRIND -D__ACE_INLINE__- I .. -Wl、-E -L / opt / ACE_wrappers /lib-L。-o a1.o a1.cpp

2.共有libT.soを生成します

g ++ -pthread -Wl、-O3 -shared -o libT.so a1.o -Wl、-E -L / opt /ACE_wrappers-L。-L / opt / ACE_wrappers / lib -lACE -ldl -lrt

3.main.oを生成します

g ++ -c -fno-strict-aliasing -fvisibility = hidden -fvisibility-inlines-hidden -O3 -ggdb -pthread -Wall -W -Wpointer-arith -pipe -D_GNU_SOURCE -I / opt / ACE_wrappers -DACE_HAS_VALGRIND-D__ACE_INLINE__-I。 。-wl、-E -L / opt / ACE_wrappers /lib-L。-o main.o main.cpp -lACE -ldl -lrt

4.実行可能ファイルをリンクして生成します

g ++ -fno-strict-aliasing -fvisibility = hidden -fvisibility-inlines-hidden -O3 -ggdb -pthread -Wall -W -Wpointer-arith -pipe -D_GNU_SOURCE -I / opt / ACE_wrappers -DACE_HAS_VALGRIND -D__ACE_INLINE__ -I ..- Wl、-E -L / opt / ACE_wrappers /lib-L。-o main main.o -lT -lACE -ldl -lrt

手順4で問題が発生しました。

main.o: In function `main': 

/main.cpp:5: undefined reference to `A::A()' 
/main.cpp:6: undefined reference to `A::print()' 

私はLinuxでC++を初めて使用しますが、なぜこれが発生するのかわかりません。コンパイルコマンドに問題があるはずです。よろしくお願いします。

4

2 に答える 2

0

さて、-fvisibility=hiddenデフォルトですべてのシンボルを非表示にするフラグを有効にしました。その結果、Aコンパイルした共有ライブラリの外部にはクラスが表示されません。

2つの解決策があります:

  1. -fvisibility=hiddenフラグは使用しないでください。これにより、デフォルトですべてのシンボルが表示されます。
  2. Aクラス(および「外の世界」から共有ライブラリでアクセスしたい他のほとんどすべて)をパブリックとしてマークします。これはコンパイラ固有であり、通常はマクロを使用して実行されます。gccの詳細については、GCCVisibilityWikiを参照してください

明確にするために、この問題はあなたとあなただけのものです。エースや他のライブラリとはまったく関係ありません。

それが役に立てば幸い。幸運を!

于 2012-11-29T19:28:04.090 に答える
0

user1349058に感謝します!何時間も調査した後、幸運にもあなたのコメントを見つけました、そしてそれは完璧に機能します。

たとえば、LinuxでACEライブラリ32ビットをビルドするときに使用したコマンドは次のとおりです。

$ make static_libs=1 buildbits=32 no_hidden_visibility=1
$ make install 
于 2015-03-24T17:26:31.030 に答える