C++ 使用g+与ACE-lib链接时出现一些问题+;
我在Suse 11 x86机器上使用ACE6.0.2。gcc的版本是4.3,ACE-TAO库编译没有问题 我想做的测试很简单,但就是不能通过 我有三份档案。 a1.h定义了a类C++ 使用g+与ACE-lib链接时出现一些问题+;,c++,linux,g++,visibility,C++,Linux,G++,Visibility,我在Suse 11 x86机器上使用ACE6.0.2。gcc的版本是4.3,ACE-TAO库编译没有问题 我想做的测试很简单,但就是不能通过 我有三份档案。 a1.h定义了a类 class A { public: A(); void print(); }; a1.cpp有一个从ACE lib调用方法的函数 #include "a1.h" #include <ace/Thread.h> #include <iostream&
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;
}
我使用的编译命令是:
1.使用ACE_线程生成a1.o
g++-c-fPIC-fno严格别名-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_u-I-Wl,-E-L/opt/ACE_wrappers/lib-L-oa1.oa1.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严格别名-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_u-I-Wl,-E-L/opt/ACE_wrappers/lib-L-o main.o main.cpp-lACE-ldl-lrt
4.链接并生成可执行文件
g++-fno严格别名-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_u-I-Wl,-E-L/opt/ACE_wrappers/lib-L-o 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++新手,不明白为什么会这样。我的编译命令一定有问题。提前谢谢您的帮助 您刚刚启用了
-fvisibility=hidden
标志,默认情况下,该标志使所有符号都隐藏。因此,您的类a
对于您编译的共享库之外的任何对象都不可见
有两种解决方案:
-fvisibility=hidden
标志。默认情况下,这将使所有符号可见A
类(以及您希望从“外部世界”访问的共享库中的几乎所有其他内容)标记为public。这是特定于编译器的,通常通过宏来完成。有关gcc的更多信息,请参阅希望能有帮助。祝你好运 谢谢用户1349058!经过几个小时的研究,幸运的是我找到了你的评论,而且效果很好 例如,我在Linux上构建ACE库32位时使用的命令是:
$ make static_libs=1 buildbits=32 no_hidden_visibility=1
$ make install
几年前我和ACE一起工作。我所做的是从ACE发行版中选取一个示例项目,删除了几乎所有的代码,然后开始添加我的代码,最终成为一个相当大的项目。好的是,我使用了现有的构建系统,它可以在所有ACE支持的平台上工作——所有类型的商业Unix、Linux和Windows。最好不要写“谢谢”的回答或评论。请删除您的答案以删除感谢便条。
$ make static_libs=1 buildbits=32 no_hidden_visibility=1
$ make install