【问题标题】:cmake and partial linking to solve symbol collisionscmake 和部分链接来解决符号冲突
【发布时间】: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


【解决方案1】:

很高兴看到它适用于您的情况。现在作为答案而不是回复:

也许只是一个想法,但不是编译生成的文件,而是将它们包装在命名空间中吗?例如:

namespace autogen1 {
#include "autogenerated1.cpp"
}

您显然需要从编译中排除自动生成的文件(因为这些文件现在通过包含被拉入),但您现在可以访问两个自动生成文件的所有成员,只需在调用前加上适当的命名空间即可。

它看起来有点老套(但没有你自己的解决方案那么糟糕 ;-))

Including one C source file in another?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2019-04-09
    • 2010-12-22
    相关资源
    最近更新 更多