使用cmake链接两个类似的库

时间:2015-01-19 08:16:43

标签: linux linker cmake shared-libraries static-libraries

我遇到cmake问题并链接我的应用程序: 我'从事现有项目。这个项目使用一个修改过的libjpeg(一个静态的lib),我的可执行文件与它相关联。

target_link_libraries( myprog jpeglib )

现在我想添加一个使用turbojpeg lib的新功能。

add_library( newfeature SHARED ${LIBVNCSERVER_SOURCES})
set_target_properties( newfeature PROPERTIES DEFINE_SYMBOL DLLDEFINE)
target_link_libraries( newfeature turbojpeg-static)
target_link_libraries( newfeature LINK_INTERFACE_LIBRARIES)

我的程序将链接到此共享库:

target_link_libraries ( myprog jpeglib newfeature )

在Windows下,一切正常。但如果我在Linux下使用此功能,我会收到错误:

JPEG Error: JPEG parameter struct mismatch: library thinks size is 488, caller expects 504

此错误由libjpeg生成。

我在Google上找到的所有东西都不起作用。 我猜共享库newfeature使用myprog中的jpeglib,尽管newfeature与turbojpeg lib静态链接。 newfeature应该是一个独立的.so或.dll文件 如果我更改了链接顺序,我得到了相同的错误,但它是从turbojpeg生成的。

将myprog与turbojpeg-static链接是不可能的,因为它与修改后的libjpeg不兼容。

有人可以帮忙吗?我的假设是对的吗?

2 个答案:

答案 0 :(得分:2)

问题在于您将libjpeg静态链接到可执行文件中,但现在您尝试在(libjpeg-turbo)上添加间接依赖项,这是同一API的另一种实现。< / p>

这是一个问题,因为libjpeg API中的每个公共API符号(函数名称等)现在有两种可能的解决方案。大多数库在一个可执行文件中不支持它们的两个版本,当然,实现相同接口的两个不同的库也不太可能这样做。

如果幸运的是libjpeg正在检查其头文件(在构建时)对其库(在运行时)的版本。当库不构建这些类型的检查时,这种问题通常不会被发现。

您应该尝试newfeature取决于libjpeg-turbo,而不是使用您自己的libjpeg来满足它,这似乎是您描述中的固定要求。

答案 1 :(得分:1)

我找到了解决方案:

我使用此cmake命令将--exclude-libs,ALL添加到newfeature的链接器命令中:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--exclude-libs,ALL")

问题是我的turbojpeg-static中的符号是由newfeature.so导出的,因此可以从“外部”看到。链接器首先从libjpeg中找到符号。将myprognewfeature.so相关联时,链接器会将newfeature方法的引用发现到turbojpeg-static并覆盖它们。

我希望我可以帮助其他人解决同样的问题。如果有什么不清楚或不正确,请告诉我。