【问题标题】:Have some problems linking with ACE lib by using g++使用 g++ 与 ACE lib 链接时遇到一些问题
【发布时间】:2012-11-17 23:03:21
【问题描述】:

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

我想做的测试很简单,但就是不能通过。

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

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

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

#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++ 新手,不明白为什么会发生这种情况。我的编译命令一定有问题。提前感谢您的帮助。

【问题讨论】:

  • 几年前我在 ACE 工作。我所做的是我从 ACE 的发行版中获取了一个示例项目,删除了几乎所有的代码,然后开始添加我的代码,这最终成为一个非常大的项目。好消息是我使用了现有的构建系统,它适用于所有支持 ACE 的平台——各种商业 Unix、Linux 和 Windows。

标签: c++ linux g++ visibility


【解决方案1】:

好吧,您刚刚启用了-fvisibility=hidden 标志,它默认隐藏所有符号。因此,您的类 A 对您编译的共享库之外的任何内容都是不可见的。

有两种解决方案:

  1. 不要使用-fvisibility=hidden 标志。这将使所有符号默认可见。
  2. A 类(以及您想从“外部世界”访问共享库中的几乎所有其他内容)标记为公开。这是特定于编译器的,通常使用宏来完成。有关 gcc 的更多信息,请参阅GCC Visibility Wiki

为了明确一点,这个问题是你的,也是你的。它与 Ace 或任何其他库完全无关。

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

【讨论】:

    【解决方案2】:

    感谢用户 1349058!经过大量小时的研究,幸运的是我找到了您的评论,并且效果很好。

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

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

    【讨论】:

    • 最好不要写“谢谢”答案或cmets。请edit您的回答删除感谢信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多