我对cmake和链接我的应用程序有一个问题:我正在处理一个现有的项目。这个项目使用了一个修改后的libjpeg (一个静态库),我的可执行文件是针对它链接的。
target_link_libraries( myprog jpeglib )现在,我想添加一个新特性,它使用了涡轮uses库。
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生成。
我在谷歌上发现的一切都不管用。我猜想共享库的新特性使用myprog中的jpeglib,尽管新特性静态地链接到涡轮uses库。新特性应该是一个独立的.so或.dll文件,如果我更改了链接顺序--我得到了相同的错误,但是它是从涡轮from生成的。
将myprog与涡旋静电连接起来是不可能的,因为它与改进的libjpeg不兼容。
有人能帮忙吗?我的假设对吗?
发布于 2015-01-21 16:57:36
我找到了解决办法:
我使用以下cmake命令将--exclude-libs,ALL添加到newfeature的链接器命令中:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--exclude-libs,ALL")问题是,来自我的turbojpeg-static的符号是由我的newfeature.so导出的,因此可以从“外部”看到。链接器首先从libjpeg中找到符号。在将myprog与newfeature.so链接时,链接器查找从my newfeature方法到turbojpeg-static的引用并覆盖它们。
我希望我能帮助其他有同样问题的人。如果有什么不清楚或不正确的地方,请告诉我。
发布于 2015-01-19 08:33:31
问题是,您正在静态地将libjpeg链接到您的可执行文件中,但是现在您正在尝试添加一个间接依赖(libjpeg-turbo),这是同一个API的另一个实现。
这是一个问题,因为现在对于每个公共API符号(函数名等)都有两种可能的解决方案。在libjpeg API中。大多数库在一个可执行文件中不支持自己的两个版本,当然两个实现相同接口的不同库不太可能支持。
如果说有什么幸运的话,那就是libjpeg正在根据它的库(在运行时)从其头文件(在构建时)检查一个版本。当库没有在这类检查中构建时,这类问题通常不会被发现。
您应该尝试使newfeature不依赖于libjpeg-turbo,而是使用您自己的libjpeg来满足它,这从您的描述中似乎是一个固定的需求。
https://stackoverflow.com/questions/28020353
复制相似问题