使用g ++与ACE lib链接时遇到一些问题

时间:2012-11-29 19:23:27

标签: c++ linux g++ visibility

我在Suse 11 x86机器上使用ACE6.0.2。gcc版本为4.3,ACE-TAO lib编译没有问题。

我想做的测试非常简单,但它无法通过。

我有三个文件。 a1.h定义了一个A类。

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

a1.cpp有一个从ACE lib调用该方法的函数。

#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.generate 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 ++新手,不明白为什么会这样。编译命令一定有问题。请提前获取帮助。

2 个答案:

答案 0 :(得分:0)

嗯,你刚刚启用了-fvisibility=hidden标志,默认情况下会隐藏所有符号。因此,您编译的共享库之外的任何内容都不会显示您的类A

有两种解决方案:

  1. 请勿使用-fvisibility=hidden标志。这将使所有符号默认可见。
  2. A类(以及您希望在“外部世界”中共享库中访问的其他所有内容)标记为公开。这是特定于编译器的,通常使用宏来完成。有关gcc的更多信息,请参阅GCC Visibility Wiki
  3. 为了说清楚,这个问题仅限于您和您的问题。它与Ace或任何其他库完全无关。

    希望它有所帮助。祝你好运!

答案 1 :(得分:0)

感谢user1349058!经过大量的研究,幸运的是我找到了你的评论并且它完美无缺。

例如,我在Linux上构建ACE库32位时使用的命令是:

$ make static_libs=1 buildbits=32 no_hidden_visibility=1
$ make install