我遇到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不兼容。
有人可以帮忙吗?我的假设是对的吗?
答案 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
中找到符号。将myprog
与newfeature.so
相关联时,链接器会将newfeature
方法的引用发现到turbojpeg-static
并覆盖它们。
我希望我可以帮助其他人解决同样的问题。如果有什么不清楚或不正确,请告诉我。