2014-11-08 83 views
0

我下载了一个框架并决定将它捆绑为一个.so文件以包含在我的其他项目中。但是框架依赖于一些静态库。我在多篇文章中看到,您无法将静态库链接到.so,因为并非所有链接程序都支持这一点。CMake:使用需要静态库的动态库构建exe文件

因此,我试图链接静态库到exe文件,并链接.so。我得到的错误说引用是未定义的(引用静态库中的东西)。

例如:

add_library(framework3 SHARED ${MY_SOURCES}) #produces libframework3.so 

然后在EXE项目:

add_executable(renderer.exe ${MY_SOURCES}) 
target_link_libraries(tsx_renderer.exe framework3) 
target_link_libraries (renderer.exe ${PROJECT_SOURCE_DIR}/Framework/Libs/libjpeg.lib) 
target_link_libraries (renderer.exe ${PROJECT_SOURCE_DIR}/Framework/Libs/libpng.lib) 

该错误消息我得到的是:

/home/joe/ClionProjects/proj/build/libframework3.so: undefined reference to `jpeg_destroy_compress' 
/home/joe/ClionProjects/proj/build/libframework3.so: undefined reference to `png_set_write_fn' 

回答

1

似乎在使用target_link_libraries时,静态库与exe无法正确链接。 我用add_libraryIMPORTED属性,而不是:

add_library(TheStaticLibrary STATIC IMPORTED) 
set_property(TARGET TheStaticLibrary PROPERTY IMPORTED_LOCATION "THE_LIBRARY_PATH") 

希望它可以帮助...

+0

事实上这是问题,我能够用“Z”短名称包括的lib同样,这让我有点失落。 – Joe 2014-11-18 17:39:12

1

链接共享对象的静态库是罚款,并应只要你自己建立一切,没有任何问题。从某处导入静态库可能会带来一些麻烦。

通常静态库是自包含的,并具有所有相关的代码来执行。这意味着一些低级标准库的东西通常包含在.a中。如果您有多个.a来自不同的平台/编译器,那么在链接期间可能会出现符号冲突/不匹配。

您正在尝试执行的操作不起作用,因为libframework3.so会尝试自行链接,而不是使用renderer.exe代码来解析符号。然后它不会找到你的.lib文件并失败

另一种解决方案是将静态库重新编译为共享对象,然后使用它们。