Linux 使用cmake链接两个类似的库

Linux 使用cmake链接两个类似的库,linux,linker,cmake,shared-libraries,static-libraries,Linux,Linker,Cmake,Shared Libraries,Static Libraries,我在cmake和链接我的应用程序时遇到问题: 我正在做一个现有的项目。这个项目使用一个修改过的libjpeg(一个静态库),我的可执行文件被链接到它上面 target_link_libraries( myprog jpeglib ) 现在我想添加一个使用turbojpeg库的新功能 add_library( newfeature SHARED ${LIBVNCSERVER_SOURCES}) set_target_properties( newfeature PROPERTIES DEFINE

我在cmake和链接我的应用程序时遇到问题: 我正在做一个现有的项目。这个项目使用一个修改过的libjpeg(一个静态库),我的可执行文件被链接到它上面

target_link_libraries( myprog jpeglib )
现在我想添加一个使用turbojpeg库的新功能

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 )
在窗户下一切都很好。但是如果我在Linux下使用此功能,我会得到一个错误:

JPEG Error: JPEG parameter struct mismatch: library thinks size is 488, caller expects 504
此错误是由libjpeg生成的

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

无法将myprog与turbojpeg静态链接,因为它与修改后的libjpeg不兼容


有人能帮忙吗?我的假设正确吗?

问题在于,您正在将
libjpeg
静态链接到可执行文件中,但现在您正试图添加对(
libjpeg-turbo
)的间接依赖,这是同一API的另一个实现

这是一个问题,因为现在
libjpeg
API中的每个公共API符号(函数名等)都有两种可能的分辨率。大多数库不支持在一个可执行文件中包含两个版本的自身,当然,实现同一接口的两个不同库也不太可能这样做

如果您在
libjpeg
中幸运地发现了什么,那就是(在构建时)根据其库(在运行时)检查其头文件中的版本。当库不在这些类型的检查中构建时,这类问题通常不会被发现


您应该尝试使
newfeature
不依赖于
libjpeg-turbo
,而是使用您自己的
libjpeg
来满足它,从您的描述来看,这似乎是一个固定的要求。

问题在于您正在将
libjpeg
静态链接到可执行文件中,但是现在您正试图添加对(
libjpeg-turbo
)的间接依赖,这是同一API的另一个实现

这是一个问题,因为现在
libjpeg
API中的每个公共API符号(函数名等)都有两种可能的分辨率。大多数库不支持在一个可执行文件中包含两个版本的自身,当然,实现同一接口的两个不同库也不太可能这样做

如果您在
libjpeg
中幸运地发现了什么,那就是(在构建时)根据其库(在运行时)检查其头文件中的版本。当库不在这些类型的检查中构建时,这类问题通常不会被发现

您应该尝试使
newfeature
不依赖于
libjpeg-turbo
,而是使用您自己的
libjpeg
来满足它,从您的描述来看,这似乎是一个固定的要求。

我找到了解决方案:

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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--exclude-libs,ALL")
问题是我的
turbojpeg static
中的符号是由我的
newfeature.so
导出的,因此从“外部”可见。链接器首先从
libjpeg
中查找符号。在针对
newfeature.so
链接
myprog
时,链接器会找到我的
newfeature
方法对
turbojpeg static
的引用,并将其覆盖

我希望我能帮助其他有同样问题的人。如果有不清楚或不正确的地方,请告诉我。

我找到了解决方案:

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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--exclude-libs,ALL")
问题是我的
turbojpeg static
中的符号是由我的
newfeature.so
导出的,因此从“外部”可见。链接器首先从
libjpeg
中查找符号。在针对
newfeature.so
链接
myprog
时,链接器会找到我的
newfeature
方法对
turbojpeg static
的引用,并将其覆盖


我希望我能帮助其他有同样问题的人。如果有不清楚或不正确的地方,请告诉我。

当您调用
jpeglib
函数或
newfeature
函数时,是否会出现错误?看起来您的
turbojpeg
库可能只需要根据以前使用的
libjpeg
的相同基本版本重新构建即可。调用newfeature函数时出错。我将尝试重建,感谢您在调用
jpeglib
函数或
newfeature
函数时提示出现错误?看起来您的
turbojpeg
库可能只需要根据以前使用的
libjpeg
的相同基本版本重新构建即可。调用newfeature函数时出错。我将尝试重建,感谢hintI我想知道,因为
newfeature
共享库是针对
turbojpeg
链接的,并且应该独立于
libjpeg
静态链接的
libjpeg
,您能澄清您使用的是哪一个吗?-“turbojpeg”还是“libjpeg turbo”?这么混乱的命名!您说您正在使用“turbojpeg”,但它是由“libjpeg-turbo”实现的,还是您正在使用另一个实现?很抱歉,我正在使用libjpeg-turbo C库(并将其重命名)好的,我明白了;我更新了我的答案以反映这一点。这是相同的症状,基本上是相同的诊断,但关于如何继续的建议略有不同。我想知道,因为
newfeature
shared lib是针对
turbojpeg
链接的,应该独立于
libjpeg
myp静态链接的
libjpeg