【发布时间】:2016-03-04 14:16:54
【问题描述】:
我有两个名称冲突的来源(autogenerated1.cpp 和 autogenerated2.cpp)。
我不想修改它们,因为它们是由 3rd 方工具生成的,所以我制作了包装器来隐藏实现。
我想在 CMAKE 上做这样的事情:
g++ -fvisibility=hidden -c autogenerated1.cpp
g++ -fvisibility=hidden -c autogenerated2.cpp
g++ -c wrapper1.cpp
g++ -c wrapper2.cpp
ld -Ur autogenerated1.o wrapper1.o -o partial1.o
ld -Ur autogenerated2.o wrapper2.o -o partial2.o
objcopy --localize-hidden partial1.o
objcopy --localize-hidden partial2.o
如何使用 CMAKE 实现类似的功能?
TARGET_OBJECT 生成器不适用于自定义命令或自定义目标。
如果没有可重定位的中间对象,我无法通过将“objcopy --localize-hidden”应用于目标的输出共享库来生成有效的静态库。
我愿意接受其他解决符号冲突的解决方案。
【问题讨论】:
-
也许只是一个想法,但不是编译生成的文件,您可以将它们包装在命名空间中吗?即
namespace autogen1 {#include "autogenerated1.cpp"}stackoverflow.com/questions/232693/… -
很棒的解决方法!它需要在包装类的同一个命名空间内完成,以避免与 wapped 标头冲突。 - 它也是一个跨平台的解决方案。谢谢!
标签: c++ gcc cmake visibility static-linking