首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用cmake链接到两个类似的库

用cmake链接到两个类似的库
EN

Stack Overflow用户
提问于 2015-01-19 08:16:42
回答 2查看 2.3K关注 0票数 0

我对cmake和链接我的应用程序有一个问题:我正在处理一个现有的项目。这个项目使用了一个修改后的libjpeg (一个静态库),我的可执行文件是针对它链接的。

代码语言:javascript
复制
target_link_libraries( myprog jpeglib )

现在,我想添加一个新特性,它使用了涡轮uses库。

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
target_link_libraries ( myprog jpeglib newfeature )

在Windows下,一切都很好。但是如果我在Linux下使用这个特性,我会得到一个错误:

代码语言:javascript
复制
JPEG Error: JPEG parameter struct mismatch: library thinks size is 488, caller expects 504

此错误由libjpeg生成。

我在谷歌上发现的一切都不管用。我猜想共享库的新特性使用myprog中的jpeglib,尽管新特性静态地链接到涡轮uses库。新特性应该是一个独立的.so或.dll文件,如果我更改了链接顺序--我得到了相同的错误,但是它是从涡轮from生成的。

将myprog与涡旋静电连接起来是不可能的,因为它与改进的libjpeg不兼容。

有人能帮忙吗?我的假设对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-21 16:57:36

我找到了解决办法:

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

代码语言:javascript
复制
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--exclude-libs,ALL")

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-19 08:33:31

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

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

如果说有什么幸运的话,那就是libjpeg正在根据它的库(在运行时)从其头文件(在构建时)检查一个版本。当库没有在这类检查中构建时,这类问题通常不会被发现。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28020353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档