cmake 和部分链接解决符号冲突

cmake and partial linking to solve symbol collisions

我有两个名称冲突的来源(autogenerated1.cpp 和 autogenerated2.cpp)。

我不想修改它们,因为它们是由第 3 方工具生成的,所以我制作了包装器来隐藏实现。

我想在 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"
}

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

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

Including one C source file in another?