Linux 使用cmake链接两个类似的库
我在cmake和链接我的应用程序时遇到问题: 我正在做一个现有的项目。这个项目使用一个修改过的libjpeg(一个静态库),我的可执行文件被链接到它上面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
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